2个不同控制器中同名的实例变量

时间:2012-09-10 01:33:43

标签: ruby ruby-on-rails-3 railstutorial.org

我完成了Michael Hartl的Ruby on Rails教程。现在我正在进行建议的练习。他构建的应用程序基本上是一个Twitter克隆,可以发布Microposts并将它们显示在您的Feed中http://ruby.railstutorial.org/chapters/user-microposts#fig-micropost_created

主页面位于StaticPagesController的home.html.erb中,并具有Micropost文本框,其中可以发布Microposts。文本框的代码如下所示:

<%= form_for(@micropost) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <div class="field">
    <%= f.text_area :content, placeholder: "Compose new micropost..." %>
  </div>
  <%= f.submit "Post", class: "btn btn-large btn-primary" %>
<% end %>

@micropost变量在StaticPagesController中初始化,如下所示:

class StaticPagesController < ApplicationController
  def home
    if signed_in?
      @micropost = current_user.microposts.build
    end
  end

现在在MicropostsController中有一个像这样的创建动作:

def create
  @micropost = current_user.microposts.build(params[:micropost])
  if @micropost.save
    flash[:success] = "Micropost created!"
    redirect_to root_url
  else
    @feed_items = []
    render 'static_pages/home'
  end
end

我的问题是第一个@micropost变量的目的是什么,而不是第二个?

感谢, 麦克

1 个答案:

答案 0 :(得分:0)

第一个@micropost可用于第一个控制器方法呈现的视图;第二个@micropost可用于第二个控制器方法呈现的视图。恰好这两种方法呈现相同的视图。

唯一的问题是因为第二个控制器是有条件的。如果创建成功(通过验证并保存),则会有重定向,因此没有正确的视图(尽管在客户端重定向之后会有片刻)。但是如果它失败了,那么视图会获得一个对象,其中包含用户输入的值以及验证错误,然后视图可以显示给用户。