2009-08-15 11 views
3

これは難しいものだと思います。私は私の他のコントローラのすべてのために使用したいというコメントコントローラ、持っている:問題があるなどの本、タイトル、など複数のコントローラーがレールに接続されている

を、コメントでcreateアクションは次のとおりです。

def create 
    @book = Book.find(params[:book_id]) 
    @comment = @book.comments.create!(params[:comment]) 
    respond_to do |format| 
    format.html {redirect_to @book} 
    format.js 
    end 

最後

どのように私は明確に本の属性を使用する場合は、&コメントコントローラのアクションコントローラを使用することができますか?

答えて

5

私はあなたが多種多様なモデルタイプに属することができるようにコメントに多態性協会を設定していると仮定していますか? this Railscasts episodeを見てください。これはコントローラーのアクションと一緒にそれを設定する方法を示しています。ここで重要なコードがあります。

# comments_controller 
def create 
    @commentable = find_commentable 
    @comment = @commentable.comments.build(params[:comment]) 
    if @comment.save 
    flash[:notice] = "Successfully created comment." 
    redirect_to :id => nil 
    else 
    render :action => 'new' 
    end 
end 

private 

def find_commentable 
    params.each do |name, value| 
    if name =~ /(.+)_id$/ 
     return $1.classify.constantize.find(value) 
    end 
    end 
    nil 
end 

# routes.rb 
map.resources :books, :has_many => :comments 
map.resources :titles, :has_many => :comments 
map.resources :articles, :has_many => :comments 
0

それは私があまりにも混乱したものです。まず親から独立したcreateメソッドを作る必要があります。

その後、あなたはカップルのオプションを持っていると思います:

  1. コメントはおそらくに取り付けられており、選択的にそれらのいずれかを記入することができ、すべてのもののためにbelonsg_toを持っています。
  2. 私は自分自身をレールにかなり新しいので、私はそれが物事の「正しい方法」だのかわからない、多分他の誰かが、Aは図書/タイトルの/ etc belongs_toのコメント

を持っていますより良い解決策。

0

まあ、各コントローラの属性を特定することなく、一般的にこれを行うことはできません。

アプリケーション内に多数のモデルの一般的なコメントモデルを作成する場合は、コメントしているモデルタイプ(モデル自体ではない)を渡す必要があります。あなたが渡したものに基づいて異なる動作を提供するスイッチ。

def create 
    if params[:type]="book" 
    @book = Book.find(params[:book_id]) 
    @comment = @book.comments.create!(params[:comment]) 
    respond_to do |format| 
     format.html {redirect_to @book} 
     format.js 
    elsif params[:type]="title" 
    @title = Title.find(params[:title_id]) 
    @comment = @title.comments.create!(params[:comment]) 
    respond_to do |format| 
     format.html {redirect_to @title} 
     format.js 
    end 
end 
関連する問題