1

私はRails 3.1.xアプリに取り組んでおり、次のモデルのセットがあります:

class Widget
  include Mongoid::Document
  field :name
  embeds_many :comments
end

class ShinyWidget < Widget; end
class DullWidget < Widget; end  

class Comment
  include Mongoid::Document
  field :message
  embedded_in :widget
end

したがって、基本的には、コメントをさまざまなタイプのウィジェットに関連付けることができるようにする必要があります。次のようなルートで標準リソースを使用します。

resources: widgets do
  resources :comments
end

GET /widgets、などの URL を公開GET /widgets/:widget_id/commentsします。しかし、さまざまな種類のウィジェットにコメントを追加するための API を公開したいと思います。これらの API URL を次のようにしたいと思います。

GET /shinywidgets/:widget_id/comments
POST /shinywidgets/:widget_id/comments

ただし、ShinyWidgetsController と DullWidgetsController は問題ありませんが、CommentsController は 1 つだけ作成したいと考えています。さまざまなタイプのウィジェットのコメントを処理する単一の CommentsController を持つ良い方法を考えていなかったので、これを試しました:

resources :widgets do
  get 'comments', to: 'widgets#comments_index'
  post 'comments', to: 'widgets#comments_create'
end

/widgets/:widget_id/comments に POST を実行すると、ハッシュは、私が望んでいたものではなく、paramsという名前のキーに投稿されているコメント データを格納します。widgetcomment

使用されたRailsがハッシュresources :comments内のそのキーを に変更するかどうかはわかっていますが、現在のセットアップでそのキーの名前をRailsに伝えることはできますか?paramscomment

現在、次のようなコメントを作成する必要があります。

def comments_create
  widget = Widget.find(params.delete :widget_id)
  comment = widget.comments.create(params[:widget])
end

私は本当にしたいです:

comment = widget.comments.create(params[:comment])

何かご意見は?

4

1 に答える 1

2

これは現在非常に間違っています。

これを正常に機能させるには、次のようなルートを作成する必要があります

resources :widgets do
  get  'comments' => 'comments#index'
  post 'comments' => 'comments#create'
end

これに投稿するときCommentsControllerは、コメント情報を に正しく渡しますprams[:comment]

あなたのコントローラーはこのようなアクションを持っています

def create
  widget = Widget.find(params.delete :widget_id)
  comment = widget.comments.create(params[:comment])
end
于 2012-07-12T12:08:39.620 に答える