渲染模板传递局部变量的麻烦
我正在运行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}
希望这有助于澄清。