I have a Page with many Comments. Many users can access this page and submit comments. I view the comments on another Page that is private.
class Page < ActiveRecord::Base has_many :comments, :dependent => :destroy accepts_nested_attributes_for :comments, :allow_destroy => true end
class Comment < ActiveRecord::Base belongs_to :page belongs_to :user end
<%= form_for @page, :remote => true do |f| %> <% f.fields_for :comments do |builder| %> <%= builder.text_area :content, :rows => 1 %> <%= builder.submit "Submit" %> <% end %> <% end %>
def show @page = Page.find(params[:id]) end def update @page = Page.find(params[:id]) @page.comments.build @page.update_attributes(params[:page]) end
The issue here is that I do not want to have the user see multiple fields for comments. Yet, if I do
<% f.fields_for :comment do |builder| %> then it throws an error because it doesn't know what one comment is, and only wants to deal with multiple.
Essentially, the user should be able to submit a single comment on a page, which has many comments, and have that automatically associated with the page. As a secondary thing, I need to have the user's id (accessible through current_user.id via Devise) associated with the comment.
<% f.fields_for :comments, f.object.comments.build do |fc| %> <!-- rest of form --> <% end %>
Also, to add in the userid into the comments form, use a hiddenfieldtag:
fc.hidden_field :user_id, current_user.id. Here are the docs: http://apidock.com/rails/ActionView/Helpers/FormHelper/hiddenfiel - Dylan Cashman 2012-04-05 14:30
could you use nested resources? basically in the routes.rb...
resources :pages do resources :comments end
then in the comments controller you can find the pages by page_id or something like that.. Don't recall exact syntax off top of head..