2014-10-15 2 views
1

Мне очень плохо с Ajax и jquery и javascript вообще и особенно плохо в Rails, так простите тупость этого вопроса.Rails 4 link выполнить простой код jQuery напрямую

У меня есть ссылка в моем приложении Rails 4, что я хочу, чтобы он выполнил простой код hide/show jquery, чтобы скрыть или показать столбец на основе значения cookie.

Я бы хотел сделать это, не называя отдельные сценарии js или кофе, но сразу же при нажатии ссылки без перезагрузки страницы.

У меня есть код Rails, который работает, чтобы записать значение cookie и показать или скрыть столбец, но перезагрузив страницу, так что теперь я пытаюсь сделать немного менее навязчиво с помощью Ajax.

В старые добрые дни, прежде чем Rails Я хотел бы сделать что-то вроде:

onclick='javascript: hideShow(this)' 

Или что-то подобное, не можете вспомнить правильный синтаксис.

Как я могу сделать это в мире Rails? Я где-то читал, что вы можете использовать link_to с блоком, но это вызывает ошибку.

Моя ссылка выглядит следующим образом:

= link_to "<span class='btn btn-sm btn-primary'>#{dogtag_icon}</span>".html_safe, users_flip_show_dogtag_path, title: icon_title, remote: true 

Я использую SLIM шаблоны, так что я попытался создать блок, как это:

= link_to "<span class='btn btn-sm btn-primary'>#{dogtag_icon}</span>".html_safe, users_flip_show_dogtag_path, title: icon_title, remote: true do 
    - dogtag_show_value = cookies[:show_library_dogtags].to_i 
    javascript: 
     if (#{dogtag_show_value} == 1) { 
     $('.dogTag').show(); 
     } else { 
     $('.dogTag').hide(); 
     } 

Rails не понравилось, что один бит.

Я также должен объяснить, что users_flip_show_dogtag_path важен, потому что это метод контроллера, в котором cookie получает значение 0 или 1, я хотел бы сохранить его, чтобы избежать написания этого кода в шаблоне представления.

Если я ammend ссылки на что-то вроде этого:

= link_to "<span class='btn btn-sm btn-primary'>#{dogtag_icon}</span>".html_safe do 

Он даже не появляется в представлении.

Казалось бы, такая простая вещь, но я не могу понять это. Поиски Google не оказались полезными.

Любая помощь будет оценена, спасибо.

Edit:

Извините за двойной редактировать, неправильный вопрос

Я использую ответ mccannf, и это, кажется, работает. Теперь мне просто нужно установить видимость столбца при загрузке на основе значения cookie. Я делаю это в верхней части зрителя, но он не работает:

javascript: 
    if (#{@dogtag_show_value} == '1') { 
    $('.dogTag').show(); 
    } else { 
    $('.dogTag').hide(); 
    } 

Еще раз спасибо.

Примечание: Я решил выше, просто поместив код в нижней части страницы после создания элемента DOM. Имея это наверху, он пытался выполнить до того, как существовал элемент DOM.Я знаю, глупая ошибка!

ответ

1

Как это работает, когда вы нажимаете на ссылку (с remote: true) в View A, это делает удаленный вызов Method_B в контроллер, который реагирует с format.js, и затем выполняет любой JavaScript в method_B.js.erb файл, находящийся в вид контроллера.

Так ваша ссылка может выглядеть следующим образом:

= link_to users_flip_show_dogtag_path, title: icon_title, id: "dogtag_link", remote: true do 
    %span.btn.btn-sm.btn-primary #{dogtag_icon} 

И сказать, что ваш метод называется show_dogtag в контроллере:

def show_dogtag 
    # Logic here e.g. @show_dogtag_value = blah 

    respond_to do |format| 
     # format.js is the important one here 
     format.js 
     format.html 
    end 
end 

И тогда вы бы добавить что-то вроде следующего в show_dogtag.js.erb под видом для контроллера (если в вашем методе обновлен dogtag_show_value):

if (<%=j @dogtag_show_value %> == 1) { 
    $('.dogTag').show(); 
} else { 
    $('.dogTag').hide(); 
} 
+0

Спасибо, я пытался избежать дополнительного файла show_dogtag.js.erb, но даже попробовал этот метод, я получаю сообщение об ошибке: 'NoMethodError - undefined method' gsub 'для 1: Fixnum: actionpack (4.0.4) lib/action_view /helpers/javascript_helper.rb:27:in 'escape_javascript'' для этой строки:' if ("<% = j @dogtag_show_value%>" == 1) {'. По-видимому, он пытается запустить 'gsub' на значение, и это целое число, но где этот пробег' gsub'? – kakubei

+0

Мне удалось обойти эту ошибку, создав файл cookie как строку вместо целого числа, что я не очень доволен, но по крайней мере это не вызывает ошибки. – kakubei

+0

Ну, файл 'js.erb' - это ненавязчивый путь! Для первой загрузки я бы посмотрел на ответ на этот вопрос: http://stackoverflow.com/questions/3437585/best-way-to-add-page-specific-javascript-in-a-rails-3-app – mccannf

Смежные вопросы