开发者

Rails 3 - Helping with a Commenting Module

class CommentsController < ApplicationController

  def create

    @commentable= context_object()
    @comment = @commentable.comments.build(params[:comment].merge(:user_id => current_user.id))

    if @comment.save
      respond_to do |format|
        format.js
      end
    else
      render :action => 'new'
    end
  end

  private  

  def context_object
    params[:constraint][:context_type].singularize.classify.constantize.find( context_id )
  end

  def context_id
    params["#{ params[:constraint][:context_type].singularize }_id"]
  end

end

This commenting module has served me well but I ran into a hitch this morning, possibly becaus开发者_开发百科e of my use of nested resources. Essentially, I now have a URL like:

/projects/3/albums/6/attachments/84

When I comment on that page, I get the error:

ActiveRecord::RecordNotFound (Couldn't find Project without an ID):
  app/controllers/comments_controller.rb:102:in `context_object'
  app/controllers/comments_controller.rb:14:in `create'

My routes file looks like:

resources :projects do
  resources : albums do
    resources :attachments
  end
end

resources :attachments do
    resources :comments, :only => [:create, :update,:destroy],
              :constraint => {:context_type => "conversations"}
end

Any ideas on how I can get the commenting module to play nicely with commenting on project>Album>Attachment ?

Thanks for the input,


Posting this as an answer in order not to clutter the comments to the original question.

Since you don't have the requirement to keep attachments available via /attachments - making the second resources block useless, do something like this:

resources :projects do
  resources :albums do
    resources :attachments do
      resources :comments, :only => [:create, :update,:destroy],
                           :constraint => {:context_type => "conversations"}
    end
  end
end

That's going to change your routes helpers (_path and _url), go through your controller(s) and view(s) and change them to reflect your new helpers.

Specifically, attachment_comments_path becomes project_album_attachment_comments_path.

The full list of routes for those models can be viewed by running rake routes in a console. I'd also recommend you take a closer look to the Rails routing guide.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜