我正在运行 Ruby on Rails 3,我想呈现一个传递局部变量的模板 (show.html.erb
)。
在 RAILS_ROOT/views/users/show.html.erb
我有
Name: <%= @user.name %>
Surname: <%= @user.surname %>
我还有一个页面 Controller 来处理页面,在 application_controller.rb
中有一个 @current_user
的实例。一个页面叫做 user
,所以在 RAILS_ROOT/views/pages/user.html.erb
我有
<%= render :template => "users/show", :locals => { :user => @current_user } %>
上面的代码不起作用(我得到这个错误:RuntimeError in Pages#user, Called id for nil, which would mistakely be 4 -- 如果你真的想要 nil 的 id,使用 object_id
) 但这有效:
<%= render :template => "users/show", :locals => { :user => @user = @current_user } %>
我认为“覆盖”@user
变量不是一个好方法。这是因为,例如,如果我需要在上面的“渲染”语句之后调用 @user
,它将不再起作用。
那么,什么是渲染show.html.erb
的解决方案?
我也试过
<%= render :template => "users/show", :locals => { @user => @current_user } %>
<%= render :template => "users/show", :locals => { :object => @current_user, :as => @user }
但那些不起作用。
更新
如果在 pages_controller.rb
我把这个
def user
@user ||= @current_user
end
它会工作并且在你可以直接使用的 View 文件中
<%= render :template => "users/show" %>
无论如何,我发现我有这个错误(更多信息见下文):
ActionController::RoutingError in Pages#user
No route matches {:action=>"destroy", :controller=>"users"}
错误是从位于从 show.html.erb
加载的部分中的此 form 语句生成的:
<%= form_for(@user, :url => user_path) do |f| %>
...
<% end %>
最佳答案
:locals => { :user => @current_user }
在模板中
Name: <%= user.name %>
局部变量是局部的,所以你不需要@
来引用它们。
@user502052
您可以从您的 Controller 显式呈现 View 。
render :template => "users/show", :locals => {...}
当您不在 Controller 中执行 render
时,框架会使用默认参数为您执行此操作。当您这样做时,您可以指定不同的模板文件、传递局部变量、呈现部分:render
函数支持的任何内容。
关于ruby-on-rails - 呈现传递局部变量的模板时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5020553/