2011-02-16 81 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}