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

时间:2011-02-16 18:27:57

标签: ruby-on-rails ruby templates ruby-on-rails-3 rendering

我正在运行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

3 个答案:

答案 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}

希望这有助于澄清。