Rails 4链接直接执行简单的jquery代码

时间:2014-10-15 11:26:18

标签: jquery ajax ruby-on-rails-4

我对Ajax,jquery和javascript一般非常糟糕,特别是在Rails中不好,所以请原谅这个问题的迟钝。

我在Rails 4应用程序中有一个链接,我希望它执行一个简单的隐藏/显示jquery代码来隐藏或显示基于cookie值的列。

我想在不调用单独的js或coffee脚本的情况下执行此操作,但是在没有重新加载页面的情况下单击链接时就是这样。

我已经让所有的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的控制器方法,我希望保留它以避免写入视图模板中的代码。

如果我推荐这样的链接:

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

它甚至不会出现在视图中。

看起来这么简单,我无法弄明白。 Google搜索未被证明有用。

任何帮助将不胜感激,谢谢。

修改

很抱歉双重修改,错误的问题

我正在使用mccannf的答案,它似乎正在运作。现在我只需要根据cookie值设置加载列的可见性。我在观众的顶部这样做,但它不起作用:

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

再次感谢。

注意: 我通过简单地在创建DOM元素后将代码放在页面底部来解决上述问题。通过将它放在顶部,它试图在DOM元素存在之前执行。我知道,这个愚蠢的错误!

1 个答案:

答案 0 :(得分:1)

它的工作方式是当您在视图A中单击链接(使用remote: true)时,它会在控制器中对Method_B进行远程调用,并使用format.js进行响应,并且然后它会在控制器视图中的method_B.js.erb文件中执行任何JavaScript。

所以您的链接可能如下所示:

= 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();
}