渲染模板传递局部变量的麻烦

我正在运行Ruby on Rails 3,我想渲染一个传递局部变量的模板( show.html.erb )。

RAILS_ROOT/views/users/show.html.erb我有

 Name:  Surname:  

我还有一个页面控制器来处理页面,在application_controller.rb一个@current_user 。 一个页面叫做user ,所以在RAILS_ROOT/views/pages/user.html.erb我有

  "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但这样RuntimeError in Pages#user, Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id

  "users/show", :locals => { :user => @user = @current_user } %> 

我认为这不是 “覆盖” @user变量的好方法 。 这是因为,例如,如果我需要在上面的’render’语句之后调用@user ,它将不再起作用。

那么,为了呈现show.html.erb ,有什么解决方案?


我也试过了

  "users/show", :locals => { @user => @current_user } %>  "users/show", :locals => { :object => @current_user, :as => @user } 

但那些不起作用。


UPDATE

如果在pages_controller.rb我把它

 def user @user ||= @current_user end 

它会工作,你可以在视图文件中使用

  "users/show" %> 

无论如何,我发现我有这个错误(更多信息见下文):

 ActionController::RoutingError in Pages#user No route matches {:action=>"destroy", :controller=>"users"} 

该错误是从位于show.html.erb加载的部分中的此表单语句生成的:

  user_path) do |f| %> ...  

 :locals => { :user => @current_user } 

并在模板中

 Name: <%= user.name %> 

局部变量是本地变量,因此您不需要@来引用它们。

@ user502052
您可以从控制器中显式呈现视图。

 render :template => "users/show", :locals => {...} 

当您不在控制器中执行render时,框架会使用默认参数为您执行此操作。 当你这样做时,你可以指定不同的模板文件,传递局部变量,渲染局部: render函数支持的任何东西。

如果你不渲染部分,并且不想使用:template选项,这也可以在Rails 4中完成:

 render 'users/show', {user: @current_user} 

url:

 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} 

希望这有助于澄清。