2011-03-07 147 views
0

Rails 2.3.5从方法渲染局部变量 - 局部变量不通过?

这是我第一次尝试从AJAX调用中的方法渲染局部变量的局部变量。查询工作正常,我无法弄清楚什么是错误的,到目前为止我无法通过搜索找到任何东西。部分渲染与本地传递给它完全相同的方式在视图中。

@group = Group.find(params[:group_id]) 

respond_to do |format| 
    format.html {render :partial => 'group_show_user_list', :locals=>{:users=>@group.users}} 
    format.js 
end 

错误:

ActionView::TemplateError (undefined local variable or method `users' for #<ActionView::Base:0x8a33030>) on line #16 of app/views/groups/_group_show_user_list.html.erb: 
13:  <tbody> 
14: 
15: 
16: <% users.each do |user| %> 
17: 
18:   <tr id="dir_user_<%= user.id %>"> 
19:    <td> 

是否有可能当部分从方法内呈现给本地变量传递到部分?或者我应该将部分改为实例变量?

非常感谢!

编辑:

这是不是一个真正的答案,但在控制器我说:

@users = @group.users 

,并在部分我说:

<% users = users || @users %> 

我真的不能因为部分最初是从组索引页面调用的,并且需要基于首次生成'show'页面时选择的一个组的唯一一组用户,所以更改整个部分。

我仍然很想知道为什么在方法中传递局部方法不起作用 - 就像我需要以与将视图中的局部方法传递给局部方法时不同的方式,或者如果传递当地人只是不从一种方法工作 - 谢谢!

+0

一切都看起来正确如果你渲染整个页面而不是部分它的作品 – 2011-03-07 04:41:10

+0

是的,我会在页面上有7个其他部分转换为ajax('show'页面是一个大用户管理页面)。下一个也有一个从组索引页面获取局部变量的部分。我会看到早晨当我尝试另一个时会发生什么。如果我仍然无法实现它,至少该解决方法很容易。我应该尝试发送一个简单的硬编码字符串“YES”作为本地来查看它是否在早晨有效。 – Reno 2011-03-07 04:52:56

+0

只需调试您的Ajax调用。因为除了一切看起来不错 – Ashish 2011-03-07 04:57:31

回答

1

您确定它是respond_to :html?在其他基于Rack的应用程序中,我经常发现它是针对AJAX调用的respond_to :js

对于测试,您可以使用render :blah, :layout=>request.xhr?打开或关闭ajax请求的布局,以便您可以在浏览器中测试路由。

您也可能想要做的:

@group = Group.find(params[:group_id]) 
render :nothing => true, :status => :not_found and return unless @group 

这将至少让你在浏览器的AJAX错误。

0

也许我找到了一个(不是)你的问题的解决方案。 而不是在您的部分<%users = users ||中设置局部变量@users%> (根据我的理解,你应该只使用本地变量中的谐音), 可以在..js.erb文件中设置的渲染命令当地人,如:

.update( “<%= escape_javascript(render(:partial =>”/ users/group_list“,:locals => {:users => @users}))%>

您仍然必须创建@users var控制器方法