Brian Roisentul
Brian Roisentul

Reputation: 4750

Rails tries to execute Update action instead of the one I want

I want to develop an ajax functionality for commenting posts in my website.

I've done this before, but I don't know why I'm having problems this time. Rails executes Update action from posts_controller, instead of the action called "save_comment".

This is the relevant line of my routes file:

map.connect "/posts/save_comment", :controller => 'posts', :action => 'save_comment'

This is the view's code:

<%= javascript_include_tag "prototype" %>

<% if logged_in? %>
  <% remote_form_for :post, PostComment.new, :url => {:action => 'save_comment',:post_id=>inside_list.id}, :html => { :method => :put} do |f| %>
    <p>
      <%= f.label 'Comment' %><br />
      <%= f.text_area :comment, :style=>'height:100px;' %>
    </p>
    <p>
      <%= f.submit 'Publish' %>
    </p>
  <% end %>
<% end %>

The save_comment action looks like this:

  def save_comment
    comment = PostComment.new
    comment.user_id = current_user.id
    comment.post_id = params[:post_id]
    comment.comment = params[:post][:comment]
    comment.save

    post = Post.find(params[:post_id])

    render :update do |page|
        page.replace_html 'dComments', :partial => 'post_comments/inside_list', :object => post
        end
  end

BTW: Is there a neater way for doing this?

Upvotes: 0

Views: 119

Answers (1)

mark
mark

Reputation: 10564

You need to define the route method. Also you're not defining the post parameter.

map.connect "/posts/:post_id/save_comment", :controller => 'posts', :action => 'save_comment', :method => :post

Following convention you should make the route method => :post, rather than :put. Put requests are generally used for updating existing records, post for creating new. Also how about named routes?

#routes.rb
map.save_comment "/posts/:post_id/save_comment", :controller => 'posts', :action => 'save_comment', :method => :post

#view
<% remote_form_for :post, PostComment.new, :url => save_comment_path(inside_list.id) do |f| %>

Also, guessing here but do you have this defined:

map.resources :posts

if you do then add the new method

map.resources :posts, :member => {:save_comment => :post}

Upvotes: 2

Related Questions