Hi All,
I am just trying to learn ruby/rails so please don''t flame me if this
is
a stupid question.
As a learning project I decided to create my own blog using ROR. I have
created a controller that shows paged blog entries, and below each blog
is a list of comments along with a form alowing the user to add a new
comment.
To create the form for the comment entry I used form_for which worked
fine. However I need to somehow set the blog Id on the comment that is
entered into that form. Here is the rhtml for the list:
<% for blog in @blogs %>
<span class="blog_header"><%=h blog.title
%></span>
<span class="blog_date"><%=h
blog.date_entered.to_s(:long) %></span>
<span class="blog_body"><%=h blog.body %></span>
<div class="blog_comments">
<span class="blog_comments_count"><%=h
pluralize(blog.comments.size,"comments") %></h2>
<% for comment in blog.comments %>
<div class="comment">
<div class="comment_name"><%=h comment.name %>
said:</div>
<div class="comment_body"><%=h comment.body
%></div>
<div class="comment_date"><%=h
comment.date_entered.to_s(:long) %></div>
</div>
<% end %>
<div class="comment_form" >
<%= error_messages_for ''comment'' %>
<fieldset>
<legend>Add your comment:</legend>
<% form_for :comment, :url => { :action => :add_comment }
do
|form| %>
<p>
<label for="name" >Name:</label>
<%= form.text_field :name %>
</p>
<p>
<label for="email" >E-Mail:</label>
<%= form.text_field :email %>
</p>
<p>
<label for="Comment"
>Comments:</label>
<%= form.text_area :body, :rows => 3, :cols => 40
%>
</p>
<%= submit_tag "Add Comment" , :class =>
"submit" %>
<% end %>
</fieldset>
</div>
</div>
</tr>
<% end %>
So you can see I have a form for block to handle the comments entry -
but if I have multiple blogs on a single page how can I specify that
this particular comment relates to blog X? If I only have one blog per
page I can get away with storing the blog id in the session, but this
seems a bit messy.
If I have not made this clear please let me know and I will try to
clarify.
Thanks,
D.
--
Posted via http://www.ruby-forum.com/.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk
-~----------~----~----~----~------~----~------~--~---
Anyone got any ideas on this - please? -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
D L wrote:> So you can see I have a form for block to handle the comments entry - > but if I have multiple blogs on a single page how can I specify that > this particular comment relates to blog X? If I only have one blog per > page I can get away with storing the blog id in the session, but this > seems a bit messy. >Hi D L, (Welcome to Rails, by the way). The key is to learn about how to specify the relationships between your models. In your comment model, indicate that it''s parent object is a Blog: class Comment < ActiveRecord::Base ... belongs_to :blog end Now, anytime you have a Comment object, you can use comment.blog to "get back" to the parent blog object. Does this help? If I misunderstood the question somehow, let me know. Jeff www.softiesonrails.com --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
Hi Jeff,
Thanks for the response, but I think you have misunderstood my question.
I understand how to link the objects and have done so with the
directives you mention (has_many, belongs_to etc). If I am working in
the ruby debugger/console I can add comments to my blogs etc using
syntax like blog1.comments.create(:body => "A Comment") and it all
gets
saved to the DB fine.
My problem is that I have a form in the view to create a new comment.
Again this works up to a point - the new comment is generated from the
params with now problems. However I intend to have multiple form_for
blocks within this view - one per blog/post to allow the user to add a
comment to any blog/post.
The problem is that I can not see any way to set the BlogId (parent) on
the comment. So I have code in my controller that looks like this:
def add_comment
@comment = Comment.new(params[:comment])
@comment.blog_id = ????????? <- Where do I get this from???
if @comment.save
flash[:notice] = "Thank you for your comment"
end
list
render :action => ''list''
end
So - how do I know which blog/post this comment relates to? The form_for
does not seem to provide a way to add another parementer which I can
pick up for the blog id. If I was only displaying one comment form per
page this would not be a problem because I could just put the blogid
into the session, and use it when the user clicks submit - but I have
more than one blog per page so I am stuck.
Any ideas?
Thanks,
D.
Jeff Cohen wrote:> D L wrote:
>> So you can see I have a form for block to handle the comments entry -
>> but if I have multiple blogs on a single page how can I specify that
>> this particular comment relates to blog X? If I only have one blog per
>> page I can get away with storing the blog id in the session, but this
>> seems a bit messy.
>>
>
> Hi D L,
>
> (Welcome to Rails, by the way).
>
> The key is to learn about how to specify the relationships between your
> models. In your comment model, indicate that it''s parent object
is a
> Blog:
>
> class Comment < ActiveRecord::Base
> ...
> belongs_to :blog
>
> end
>
> Now, anytime you have a Comment object, you can use comment.blog to
> "get back" to the parent blog object.
>
> Does this help? If I misunderstood the question somehow, let me know.
>
> Jeff
> www.softiesonrails.com
--
Posted via http://www.ruby-forum.com/.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk
-~----------~----~----~----~------~----~------~--~---
Have you thought about using Ajax to create the form on the fly, thereby making the ownership of the comment clearer? D L-3 wrote:> > > > Hi Jeff, > > Thanks for the response, but I think you have misunderstood my question. > > I understand how to link the objects and have done so with the > directives you mention (has_many, belongs_to etc). If I am working in > the ruby debugger/console I can add comments to my blogs etc using > syntax like blog1.comments.create(:body => "A Comment") and it all gets > saved to the DB fine. > > My problem is that I have a form in the view to create a new comment. > Again this works up to a point - the new comment is generated from the > params with now problems. However I intend to have multiple form_for > blocks within this view - one per blog/post to allow the user to add a > comment to any blog/post. > The problem is that I can not see any way to set the BlogId (parent) on > the comment. So I have code in my controller that looks like this: > > def add_comment > @comment = Comment.new(params[:comment]) > @comment.blog_id = ????????? <- Where do I get this from??? > if @comment.save > flash[:notice] = "Thank you for your comment" > end > list > render :action => ''list'' > end > > So - how do I know which blog/post this comment relates to? The form_for > does not seem to provide a way to add another parementer which I can > pick up for the blog id. If I was only displaying one comment form per > page this would not be a problem because I could just put the blogid > into the session, and use it when the user clicks submit - but I have > more than one blog per page so I am stuck. > > Any ideas? > > Thanks, > > D. > > > Jeff Cohen wrote: >> D L wrote: >>> So you can see I have a form for block to handle the comments entry - >>> but if I have multiple blogs on a single page how can I specify that >>> this particular comment relates to blog X? If I only have one blog per >>> page I can get away with storing the blog id in the session, but this >>> seems a bit messy. >>> >> >> Hi D L, >> >> (Welcome to Rails, by the way). >> >> The key is to learn about how to specify the relationships between your >> models. In your comment model, indicate that it''s parent object is a >> Blog: >> >> class Comment < ActiveRecord::Base >> ... >> belongs_to :blog >> >> end >> >> Now, anytime you have a Comment object, you can use comment.blog to >> "get back" to the parent blog object. >> >> Does this help? If I misunderstood the question somehow, let me know. >> >> Jeff >> www.softiesonrails.com > > > -- > Posted via http://www.ruby-forum.com/. > > > > >-- View this message in context: http://www.nabble.com/form_for---Child-object---how-to-set-parent-id-tf2231865.html#a6193614 Sent from the RubyOnRails Users forum at Nabble.com. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
> > The problem is that I can not see any way to set the BlogId (parent) on > > the comment. So I have code in my controller that looks like this: > > > > def add_comment > > @comment = Comment.new(params[:comment]) > > @comment.blog_id = ????????? <- Where do I get this from??? > > if @comment.save > > flash[:notice] = "Thank you for your comment" > > end > > list > > render :action => ''list'' > > end > >From your view code I assume that you create one blank comment in your controller and are trying to reuse that? A better way may be to add a new_comment method to the blog model: def new_comment Comment.new( :blog=>self ) end and then use <%= form_for :comment, blog.new_comment, :url=>... %> <%= form.hidden_field :blog_id %> If you want to stick with the one-template-comment approach, do something like <%= hidden_field :comment, :blog_id, :value=>blog.id %> Cheers, Max --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---
Max Muermann wrote:>> > render :action => ''list'' >> > end >> > > > From your view code I assume that you create one blank comment in your > controller and are trying to reuse that? > > A better way may be to add a new_comment method to the blog model: > > def new_comment > Comment.new( :blog=>self ) > end > > and then use > > <%= form_for :comment, blog.new_comment, :url=>... %> > <%= form.hidden_field :blog_id %> > > If you want to stick with the one-template-comment approach, do > something like > > <%= hidden_field :comment, :blog_id, :value=>blog.id %> > > Cheers, > MaxHi Max - Thanks for your response - the hidden field idea looks like a good way round my issue. I did find another way around it - I replaced the form_for tag with: <%= form_tag :action => :add_comment, :id => blog %> <p> <label for="name" >Name:</label> <%= text_field "comment", "name" %> </p> etc etc And my controller code now looks like: def add_comment @comment = Comment.new(params[:comment]) @comment.blog_id = params[:id] if @comment.save Are there any gotcha''s with this? Should I do it the way you suggest, rather than have I have done it? Cheers, D. -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk -~----------~----~----~----~------~----~------~--~---