Add partials section to getting started guide

This commit is contained in:
Oscar Del Ben 2012-04-25 15:43:10 +02:00
parent ccbd32c294
commit ee4e7125a6
4 changed files with 104 additions and 4 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -1,4 +1,4 @@
<%= form_for :post, :url => { :action => :update, :id => @post.id }, :method => :put do |f| %>
<%= form_for @post do |f| %>
<% if @post.errors.any? %>
<div id="errorExplanation">
<h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>

View File

@ -6,9 +6,9 @@ Blog::Application.routes.draw do
get "posts" => "posts#index"
get "posts/new"
post "posts/create"
get "posts/:id" => "posts#show"
get "posts/:id" => "posts#show", :as => :post
get "posts/:id/edit" => "posts#edit"
put "posts/:id/update" => "posts#update"
put "posts/:id" => "posts#update"
# The priority is based upon order of creation:
# first created -> highest priority.

View File

@ -835,7 +835,7 @@ Moving on, we need to add the +update+ action. The file
+config/routes.rb+ will need just one more line:
<ruby>
put "posts/:id/update"
put "posts/:id" => "posts#update"
</ruby>
And the +update+ action in +posts_controller+ itself should not look too complicated by now:
@ -930,6 +930,106 @@ Our +edit+ action looks very similar to the +new+ action, in fact they
both share the same code for displaying the form. Lets clean them up by
using a +_form+ partial.
Create a new file +app/views/posts/_form.html.erb+ with the following
content:
<erb>
<%= form_for @post do |f| %>
<% if @post.errors.any? %>
<div id="errorExplanation">
<h2><%= pluralize(@post.errors.count, "error") %> prohibited
this post from being saved:</h2>
<ul>
<% @post.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<p>
<%= f.label :title %><br>
<%= f.text_field :title %>
</p>
<p>
<%= f.label :text %><br>
<%= f.text_area :text %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
</erb>
Everything except for the +form_for+ declaration remained the same. I'll
explain later how +form_for+ can figure out the right +action+ and
+method+ attributes when building the form, for now let's update the
+new+ and +edit+ views:
<erb>
# app/views/posts/new.html.erb
<h1>New post</h1>
<%= render 'form' %>
<%= link_to 'Back', :action => :index %>
# app/views/posts/edit.html.erb
<h1>Edit post</h1>
<%= render 'form' %>
<%= link_to 'Back', :action => :index %>
</erb>
Point your browser to
"http://localhost:3000/posts/new":http://localhost:3000/posts/new and
try creating a new post. Everything still works. Now try editing the
post and you'll receive the following error:
!images/getting_started/undefined_method_post_path.png(Undefined method
post_path)!
To understand this error, you need to understand how +form_for+ works.
When you pass an object to +form_for+ and you don't specify a +:url+
option, Rails will try to guess the +action+ and +method+ options by
checking if the passed object is a new record or not. Rails follows the
REST convention, so to create a new +Post+ object it will look for a
route named +posts_path+, and to update a +Post+ object it will look for
a route named +post_path+ and pass the current object. Similarly, rails
knows that it should create new objects via POST and update them via
PUT.
If you run +rake routes+ from the console you'll see that we already
have a +posts_path+ route, which was created automatically by Rails.
However, we don't have a +post_path+ yet, which is the reason why we
received an error before.
<shell>
# rake routes
posts GET /posts(.:format) posts#index
posts_new GET /posts/new(.:format) posts#new
posts_create POST /posts/create(.:format) posts#create
GET /posts/:id(.:format) posts#show
GET /posts/:id/edit(.:format) posts#edit
PUT /posts/:id(.:format) posts#update
root / welcome#index
</shell>
To fix this, open +config/routes.rb+ and modify the +get "posts/:id"+
line like this:
<ruby>
get "posts/:id" => "posts#show", :as => :post
</ruby>
Now you'll be able to update posts again.
h4. Using the Console
To see your validations in action, you can use the console. The console is a