This functionality used to work but has suddenly stopped and I have no idea why. I’ve made changes before I ran the tests but, having retraced my steps I don’t know what has changed. Can a fresh pair of eyes tell me why this is saving the posts but not the locations?
Model Post.rb
class Post < ActiveRecord::Base
attr_accessible :title, :body, :tag_list, :locations_attributes
has_and_belongs_to_many :locations
accepts_nested_attributes_for :locations, :reject_if => :all_blank
end
*Controller Posts_controller.rb *
class PostsController < ::Blogit::ApplicationController
...
def new
@post = current_blogger.blog_posts.new(params[:post])
@location = @post.locations.build
end
def update
@post = current_blogger.blog_posts.find(params[:id])
if @post.update_attributes(params[:post])
redirect_to @post, notice: 'Blog post was successfully updated.'
else
render action: "edit"
end
end
def create
@post = current_blogger.blog_posts.new(params[:post])
if @post.save
redirect_to @post, notice: 'Blog post was successfully created.'
else
render action: "new"
end
end
end
*View _form.html.erb*
<%= nested_form_for(@post, :html=> {:multipart => true, :class=> "new_blog_post", :id=> "new_blog_post"}) do |f| %>
...
<%= field do %>
<%= f.text_field :title, placeholder: "Give your post a title", :class=>"span12" %>
<% end %>
<%= field do %>
<%= f.text_area :body, placeholder: "Write something here...", :id=>"blog-text", :class=>"span12" %>
<% end %>
<%= field id: "new_blog_post_tag_field" do %>
<%= f.label :tag_list, "Tags" %>
<%= f.text_field :tag_list, placeholder: "tag one, tag two, etc..." %>
<% end %>
<%= f.label :search_locations, "Add locations to your post" %>
<%= render :partial => 'search_locations', :locals => { :f => f } %>
<p><%= f.link_to_add "Add a location", :locations %></p>
<%= actions do %>
<%= f.submit "Submit", :class=>"btn", :disable_with => 'Uploading Image...' %> or
<%= link_to("cancel", @post.new_record? ? root_path : post_path(@post)) %>
<% end %>
<% end %>
*Form Partial _search_locations.html.erb*
<%= f.fields_for :locations do |m| %>
<%= m.text_field :name,:class=>"localename", :id=>"appendedInput", :placeholder=> "Name of the location", :autocomplete => "off" %>
<span class="add-on"><%= m.link_to_remove do %><i class='icon-trash'></i></span><%end%>
<% end %>
And the actual submission in the logs comes up as this:
Started PUT "/blog/posts/51-hong-kong" for 127.0.0.1 at 2012-11-06 17:41:00 +0000
Processing by Blogit::PostsController#update as HTML
Parameters: {"utf8"=>"✓",
"authenticity_token"=>"s+2117Qi/HzO/D/ORINhqHChMJR3S5XK7y/s3rq3dnc=", "post"=>{"title"=>"Hong
Kong ", "body"=>"Lorem ipsum dolor sit amet, consectetur adipiscing elit. In orci elit,
rhoncus quis interdum vel, interdum non nulla. Phasellus nec massa lorem. Duis malesuada
pellentesque orci, accumsan mollis augue aliquam mollis. Pellentesque luctus orci in enim
hendrerit adipiscing. Mauris tempor tortor in leo posuere tristique.", "tag_list"=>"",
"locations_attributes"=>{"0"=>{"_destroy"=>"false",
"name"=>"London","longitude"=>"-0.1276831", "latitude"=>"51.5073346"}}},
"_wysihtml5_mode"=>"1", "name"=>"London", "legname"=>"London", "longitude"=>"-0.1276831",
"latitude"=>"51.5073346", "commit"=>"Submit", "id"=>"51-hong-kong"}
Why is this saving the post but not the locations info?
Solved it, it was a stray bit of code in the model.
Thanks for all your help!