Skip to content

Commit

Permalink
Add partials section to getting started guide
Browse files Browse the repository at this point in the history
  • Loading branch information
oscardelben committed Apr 25, 2012
1 parent ccbd32c commit ee4e712
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 4 deletions.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion guides/code/getting_started/app/views/posts/_form.html.erb
@@ -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>
Expand Down
4 changes: 2 additions & 2 deletions guides/code/getting_started/config/routes.rb
Expand Up @@ -6,9 +6,9 @@
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.
Expand Down
102 changes: 101 additions & 1 deletion guides/source/getting_started.textile
Expand Up @@ -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:
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit ee4e712

Please sign in to comment.