mirror of https://github.com/rails/rails
Add partials section to getting started guide
This commit is contained in:
parent
ccbd32c294
commit
ee4e7125a6
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
|
@ -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>
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue