2011-02-16 94 views
9

我on Rails的3运行Ruby和我想呈现模板(show.html.erb)传递一个局部变量的模板。麻烦渲染传递一个局部变量

RAILS_ROOT/views/users/show.html.erb

Name: <%= @user.name %> 
Surname: <%= @user.surname %> 

我也有一个页面控制器来处理页面,并在application_controller.rb@current_user的istance。一个页面被称为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 } %> 

我想是不是一个好的方法来“覆盖”@user变量。这是因为,例如,如果我需要在上述“渲染”语句后回想@user,它将不再起作用。

那么,什么是为了渲染show.html.erb的解决方案?


我也

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

tryed但那些不工作。


UPDATE

如果pages_controller.rb我把这个

def user 
    @user ||= @current_user 
end 

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

<%= render :template => "users/show" %> 

反正我discoverd我有这个错误(更多信息见下面):

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

从该形式位于部分负载从show.html.erb语句生成错误:

<%= form_for(@user, :url => user_path) do |f| %> 
    ... 
<% end %> 

回答

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

,并在模板

Name: <%= user.name %> 

局部变量是局部的,所以你不需要@来引用它们。

@ user502052
您可以从控制器显式渲染视图。

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

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

+0

好了,你的代码工作。但是,因为在我看来,我有`@ user`语句(其他控制器依赖于语句`@ user`),所以我需要使用该“格式”。 – user502052 2011-02-16 18:33:29

+0

@ user502052`@ user`是一个全局变量,你不能'本地化'它。我建议以相同的方式从你的控制器传递局部变量。 – 2011-02-16 18:35:38

0

网址:

http://localhost/pages/user 

这将呼吁pages_controller用户的方法。你有这样的:

def user 
    @user ||= @current_user 
end 

Rails的创建一个实例变量@users,默认情况下会尝试呈现在应用程序/视图/页/ user.html.erb视图模板。如果这不是你想要的,你必须在控制器中这样说:

def user 
    @user ||= @current_user 
    render :template => "users/show", :locals => { :user => @current_user } 
end 

现在,这将使得应用程序/视图/用户/ show.html.erb与局部变量称为用户,而不是默认的应用程序/views/pages/user.html.erb。

当前您正在等待,直到您位于视图模板中,然后要求呈现其他视图模板。一旦你在一个视图模板,你应该只需要渲染部分模板:

render :partial => 'users/show', :locals => {:user => @current_user} 

希望这有助于澄清。

2

万一你是不是渲染的部分,而不想使用:模板选项,这也可以在轨道4,5进行搭配:

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