cj3kim
cj3kim

Reputation: 196

Form does not save! rails

My goal is to update the about section of the site on a semi-regular basis. I want to do this using named resources. My problem is the form won't save to the db and will forward to the about page after I click the "Create Text" button.

I've looked at my routes, controller, and views but I don't know what I'm doing wrong. Any help is appreciated.

Here is the console output:

Started POST "/about" for 127.0.0.1 at 2012-04-13 17:45:29 -0700
Processing by StaticPagesController#about as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"kmkSyhhqrHiwtIEMd8R1+EEh1ic7688h7lNFW9FnMUM=", "text"=>   {"title"=>"", "text"=>"asdfasd"}, "commit"=>"Create Text"}
Text Load (0.2ms)  SELECT "texts".* FROM "texts" WHERE "texts"."id" = ? LIMIT 1  [["id", 6]]
Text Load (0.2ms)  SELECT "texts".* FROM "texts" WHERE "texts"."id" = ? LIMIT 1  [["id", 7]]
Text Load (0.1ms)  SELECT "texts".* FROM "texts" WHERE "texts"."id" = ? LIMIT 1  [["id", 8]]
Rendered static_pages/about.html.erb within layouts/application (0.7ms)
Rendered shared/_header.html.erb (1.5ms)
Rendered shared/_footer.html.erb (1.1ms)
Completed 200 OK in 30ms (Views: 15.5ms | ActiveRecord: 1.1ms)

Here is the about.html.erb view:

 1 <div id="container_about">
 2   <%= image_tag "chocolate_lady.jpg", id: "about_image" %>  
 3   <div id="right_column_about" > 
 4     <h1> Who we are </h1>
 5     <%= @text1.text %> 
 6     <br /> 
 7     <br /> 
 8     <%= @text2.text %>
 9     <br />
 10     <br /> 
 11     <%= @text3.text %>
 12   </div> 
 13 </div>   

Here is the form view:

4   <%= flash[:notice] %>
5   <%= flash[:status] %>
6   
7 <%= form_for @about, :url => { :action => 'save_about'}  do |f| %>
8 
9   <div class="field">
10     <%= f.label :title %><br />
11     <%= f.text_field :title %>
12   </div>
13   <div class="field">
14     <%= f.label :text %><br />
15     <%= f.text_area :text %>
16   </div>
17 
18   <div class="actions">
19     <%= f.submit %>
20   </div>
21 <% end %>
22 

The form html:

<form accept-charset="UTF-8" action="/about" class="new_text" id="new_text" method="post"><div    style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓"><input name="authenticity_token"   type="hidden" value="kmkSyhhqrHiwtIEMd8R1+EEh1ic7688h7lNFW9FnMUM="></div>

<div class="field">
<label for="text_title">Title</label><br>
<input id="text_title" name="text[title]" size="30" type="text">
</div>
<div class="field">
<label for="text_text">Text</label><br>
<textarea cols="40" id="text_text" name="text[text]" rows="20"></textarea>
</div>

 <div class="actions">
<input name="commit" type="submit" value="Create Text">
 </div>
</form>

Here is my rake routes:

product_photos GET    /product_photos(.:format)          product_photos#index
               POST   /product_photos(.:format)          product_photos#create
new_product_photo GET    /product_photos/new(.:format)      product_photos#new
edit_product_photo GET    /product_photos/:id/edit(.:format) product_photos#edit
product_photo GET    /product_photos/:id(.:format)      product_photos#show
               PUT    /product_photos/:id(.:format)      product_photos#update
               DELETE /product_photos/:id(.:format)      product_photos#destroy
          root        /                                  static_pages#home
      products        /products(.:format)                ProductPhotos#index
         about        /about(.:format)                   static_pages#about
       contact        /contact(.:format)                 static_pages#contact
        policy        /policy(.:format)                  static_pages#policy
      new_text        /about/new(.:format)               static_pages#new_about
     show_text        /about/:id(.:format)               static_pages#show_about
               POST   /about(.:format)                   static_pages#save_about

Here are my routes:

 7   match '/products' => 'ProductPhotos#index'
 8   match '/about' => 'static_pages#about' 
 9   match '/contact' => 'static_pages#contact' 
10   match '/policy' => 'static_pages#policy'
11   match '/about/new/' => 'static_pages#new_about', :as => :new_text
12   match '/about/:id' => 'static_pages#show_about', :as => :show_text
13   match '/about/' => 'static_pages#save_about', via: 'post'

Here is my controller:

12   def show_about
13     @about = Text.find(params[:id])
14 
15     respond_to do |format|
16       format.html
17       format.json { render json: @about }
18     end 
19   end
20 
21   def new_about  
22     @about = Text.new 
23     respond_to do |format|
24       format.html # new_about.html.erb
25       format.json { render json: @about }
26     end
27   end
28 
29   def save_about
30     @about = Text.new(params[:text]) 
31     
32     respond_to do |format|
33       if @about.save
34         format.html { redirect_to show_about_path(@about), notice: 'Product photo was successfully created.' }
35         format.json { render json: @about, status: :created, location: @about }
36       else
37         format.html { redirect_to action: 'new_about',  notice: 'Product photo wasn\'t save'}
38         format.json { render json: @about.errors, status: :unprocessable_entity }
39       end
40     end
41   end
42   

Upvotes: 0

Views: 402

Answers (1)

Ben
Ben

Reputation: 13635

8 match '/about' => 'static_pages#about' matches the same route as 13 match '/about/' => 'static_pages#save_about', via: 'post'

Since they both match /about and the generic one is first, this one will be used. Either put the more specific route first match '/about/' => 'static_pages#save_about', via: 'post' and the generic one after, or change the generic route to make it listen to :get like match '/about' => 'static_pages#about', via: :get. By adding :get specifically it will never consume a :post.

Basically when you run rake routes you want to see a HTTP method for every path like

    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit

Upvotes: 3

Related Questions