我完成了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变量的目的是什么,而不是第二个?
感谢, 麦克
答案 0 :(得分:0)
第一个@micropost
可用于第一个控制器方法呈现的视图;第二个@micropost
可用于第二个控制器方法呈现的视图。恰好这两种方法呈现相同的视图。
唯一的问题是因为第二个控制器是有条件的。如果创建成功(通过验证并保存),则会有重定向,因此没有正确的视图(尽管在客户端重定向之后会有片刻)。但是如果它失败了,那么视图会获得一个对象,其中包含用户输入的值以及验证错误,然后视图可以显示给用户。