我意识到这与其他一些问题类似,但我已经通过了相当多的问题,我认为我正在做他们建议的事情,但我的代码仍然没有用。
因此,正如标题所示,我试图从js.erb文件加载部分(响应AJAX调用。)但是,它无法正常工作。
full_list.html.haml:
=link_to(test_path(@work), id: "privacy-button", remote: true) do
= render "privacy_button_content", locals: {:show_others => @work.show_others}
_privacy_button_content.html.haml:
-if locals[:show_others] == false
-test_string = "twas false"
-else
-test_string = "twas true"
%p = test_string
works_controller.rb:
def test_function
@work.model_function
respond_with(:layout => false)
end
test_function.js.erb:
$("#privacy-button").html("<%= escape_javascript render(:partial => 'privacy_button_content', locals: {:show_others => @work.show_others}) %>");
所以full_list有privacy_button,它渲染部分,而点击#privacy-button的响应应该是修改控制器中的内容,并获得response.js.erb。
这在页面加载时正常工作(所以将本地传递给部分工作),但每当我运行AJAX调用时我都会
(undefined local variable or method `locals' for #<#<Class:0x00000005006338>:0x000000068481f8>):
任何帮助都将不胜感激。
答案 0 :(得分:1)
更新_privacy_button_content.html.haml
,如下所示:
-if show_others == false
-test_string = "twas false"
-else
-test_string = "twas true"
%p = test_string
当您在本地哈希中传递show_others
时,将为您创建一个名为show_others
的局部变量。您可以在部分而不是show_others
。{/ p>中以locals[:show_others]
的身份访问它
请参阅Rails指南中的 Passing local variables 。
答案 1 :(得分:0)
所以,我已经弄明白了。在haml工作时,我得到的具体错误似乎与渲染语法有关(当我从视图中指定render :partial
时我遇到了同样的问题,因此它不是js.erb独有的。)
partial.js.erb中的代码现在看起来像:
$("#privacy-button").html("<%= escape_javascript render("privacy_button_content", :locals => {:show_others => @work.show_others}) %>");
如您所见,主要区别在于render "works_group_list"
而不是render( partial: => "works_group_list"
。正如我所说,我相信这可能与我在Haml中编写的视图有关,但应该注意的是,render(partial:...)语法在不尝试从js.erb传递局部变量时确实有效。 / p>
我也遇到了一些小问题,因为我在js中将#my_element称为#my_element,而在html中它是#my-element。因此,如果你遇到这个问题,检查你的拼写(第30次)永远不会伤害。
编辑:
只是注意,正如其他人指出的那样使用locals哈希不是强制性的。所以代码行可以改为
$("#privacy-button").html("<%= escape_javascript render("privacy_button_content", :show_others => @work.show_others ) %>");
只要您适当更新部分内容(参考var
而不是locals[:var]
),此功能就会有效。
答案 2 :(得分:0)
应用Kirti Thorat的更改,然后更改
= render "privacy_button_content", locals: {:show_others => @work.show_others}
的
= render "privacy_button_content", show_others: @work.show_others
另请注意,视图不应包含逻辑,应位于帮助或装饰器
顺便说一句:我认为%p = test_string
应为%p= test_string