我正在运行Ruby on Rails 3,我想渲染一个传递局部变量的模板(show.html.erb
)。
在RAILS_ROOT/views/users/show.html.erb
我有
Name: <%= @user.name %>
Surname: <%= @user.surname %>
我还有一个页面控制器来处理页面,并application_controller.rb
的{{1}}。页面名为@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 mistakenly be 4 -- if you really wanted the id of nil, use object_id
我认为“覆盖”<%= render :template => "users/show", :locals => { :user => @user = @current_user } %>
变量不是一个好方法。这是因为,例如,如果我需要在上面的'render'语句之后调用@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
无论如何,我发现我有这个错误(请参阅下面的更多信息):
<%= render :template => "users/show" %>
错误是从位于ActionController::RoutingError in Pages#user
No route matches {:action=>"destroy", :controller=>"users"}
加载的部分中的表单语句生成的:
show.html.erb
答案 0 :(得分:18)
:locals => { :user => @current_user }
并在模板中
Name: <%= user.name %>
本地变量是本地变量,因此您无需@
来引用它们。
<强> @ user502052 强>
您可以从控制器中显式呈现视图。
render :template => "users/show", :locals => {...}
如果您未在控制器中执行render
,框架会使用默认参数为您执行此操作。执行此操作时,您可以指定不同的模板文件,传递局部变量,渲染部分:任何render
函数支持。
答案 1 :(得分:2)
如果你不渲染部分,并且不想使用:template选项,这也可以在Rails 4中完成:
render 'users/show', {user: @current_user}
答案 2 :(得分:0)
网址:
http://localhost/pages/user
这将调用pages_controller上的user方法。你有这个:
def user
@user ||= @current_user
end
Rails创建一个实例变量@users,默认情况下会尝试在app / views / pages / user.html.erb中呈现视图模板。如果那不是你想要的,你必须在控制器中这样说:
def user
@user ||= @current_user
render :template => "users/show", :locals => { :user => @current_user }
end
现在,这将使用名为user的局部变量而不是默认的app / views / pages / user.html.erb呈现app / views / users / show.html.erb。
目前,您正在等待,直到您进入视图模板,然后要求渲染另一个视图模板。进入视图模板后,您只需要渲染部分模板:
render :partial => 'users/show', :locals => {:user => @current_user}
希望这有助于澄清。