0

我完成了 Michael Hartl 的 Ruby on Rails 教程。现在我正在研究建议的练习。他构建的应用程序基本上是 Twitter 的克隆,人们可以在其中发布 Microposts,它们会出现在您的提要中http://ruby.railstutorial.org/chapters/user-microposts#fig-micropost_created

主页home.html.erb来自 StaticPagesController,并具有一个 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 变量与第二个变量相比的目的是什么?

谢谢,迈克

4

1 回答 1

0

第一个@micropost可用于由第一个控制器方法呈现的视图;第二个@micropost可用于由第二个控制器方法呈现的视图。碰巧这两种方法正在渲染相同的视图。

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

于 2012-09-10T01:52:39.817 回答