我对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元素存在之前执行。我知道,这个愚蠢的错误!
答案 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();
}