I finished Michael Hartl’s Ruby on Rails Tutorial. Now I’m working on the suggested exercises. The application he builds is basically a Twitter clone where one can post Microposts and they appear in your feed http://ruby.railstutorial.org/chapters/user-microposts#fig-micropost_created
The main page is in home.html.erb from the StaticPagesController and features a Micropost textbox where one can post Microposts. The code for the textbox looks like so:
<%= 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 %>
The @micropost variable is initialized in the StaticPagesController like so:
class StaticPagesController < ApplicationController
def home
if signed_in?
@micropost = current_user.microposts.build
end
end
Now inside the MicropostsController there’s a create action like so:
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
My question is what is the purpose of the first @micropost variable as opposed to the second?
thanks,
mike
The first
@micropostbecomes available to the view rendered by the first controller method; the second@micropostbecomes available to the view rendered by the second controller method. And it just so happens that the two methods are rendering the same view.The only wrinkle is that since the second controller is conditional. If the create succeeds (passes validation and saves) then there’s a redirect, so there’s no proper view (although there will be in a moment, after the client-side redirect). But if it fails, then the view gets an object that contains the user-entered values as well as the validation errors which the view can then show to the user.