2017-02-11 4 views
0

У меня есть файл coffescript внутри javascript-папки и находящийся внутри этой папки, рельсы автоматически добавляют его ко всем представлениям, но я хочу, чтобы этот файл использовался только в одном представлении, потому что если он добавленные к другим представлениям, которые вы можете изменить.Добавление coffeescript в заданное представление

+0

Возможный дубликат [Rails и Javascript] (http://stackoverflow.com/questions/18724247/rails-and-page-specific-javascript) – Iceman

ответ

1

Это относительно распространенная проблема, но есть несколько вещей, которые вы можете сделать, чтобы сделать только этот javascript на определенной странице.

Javascript модуль шаблон

Используя шаблон модуля, вы хотите, чтобы обернуть большую часть JavaScript в анонимных затворов как так (в CoffeeScript):

do -> 
    # ... all vars and functions are in this scope only 
    # still maintains access to all globals 
    return 

код внутри затворов, которые вы хотите выполнить может быть обернуты внутри объекта, как это:

(($) -> 
    myObj = myFunc: (param) -> 
    # do stuff ... 
    return 

    $('selector').click -> 
    myObj.myFunc() 
    return 
    return 
) jQuery 

Так код, который вы хотите выполнить обернута внутри функции в объекте, а затем может вызвать этот объект при запуске события. Если код, который вы хотите запустить в одном представлении, зависит только от пользовательских взаимодействий, таких как клики, зависания и другие события, вы можете сделать что-то вроде этого.

CSS тела классы

В рельсах, вы можете добавить контроллера и действия классов в теле тега. Делая это, вы можете использовать javascript для таргетинга класса css для тела, а затем либо выполнить некоторый код, либо не на основе класса текущего представления. Это будет выглядеть вроде этого:

В application.html.erb

<body class = "<%= controller_name %> <%= action_name %>" 

Давайте предположим, что вы хотите выполнить некоторые CoffeeScript для new действия Вашего articles контроллера, то в файле CoffeeScript:

if $('body').hasClass('articles') and $('body').hasClass('new') 
    # do stuff for the articles#new 
else 

Paloma камень

Вы можете проверить paloma gem, но я не думаю, что камень является активным Я поддерживал его больше.

Я надеюсь, что это поможет!

+0

Спасибо, но можно было бы сделать что-то вроде отключения require_tree и добавлять теги с помощью «src», которые указывают на адрес кофейных и javascripts, чтобы добавить их вручную в каждый файл, в случае, если есть некоторые, которые должны использоваться во всем проекте. Размещаются в layaout и те, которые не размещены в их соответствующих взглядах. Было бы возможно? – LuisC

+0

Да, это технически возможно, но это сильно зависит от рекомендуемого и предпочтительного пути рельсов. Это также будет большой проблемой производительности, поскольку серверу придется использовать другой актив для потенциально каждого вида. Если вы все еще хотите это сделать, вам придется отказаться от использования конвейера активов и вручную настроить каждое представление для использования конкретного файла JavaScript. Я бы настоятельно рекомендовал вариант 2 выше. – Mark