Rails js.erb响应没有将本地发送给Haml partial

时间:2014-04-08 22:51:48

标签: ruby-on-rails ajax

我意识到这与其他一些问题类似,但我已经通过了相当多的问题,我认为我正在做他们建议的事情,但我的代码仍然没有用。

因此,正如标题所示,我试图从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>):

任何帮助都将不胜感激。

3 个答案:

答案 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