2

2 つの別個の db テーブルに対応する 2 つのモデルがあります。

モデル 1: ユーザー ex のステータス更新。( コメント: こんにちは | ユーザー名: marc) モデル 2: ユーザーが食べたレストランの名前 ( レストラン: KFC | ユーザー名: marc)

Google 検索から生成されたレストランのウェブサイトを表示するビューが 1 つあります。リストされているレストランごとに非表示のフォームも生成されます。ユーザーが「ここで食べました!」を押すと、ボタンをクリックすると、この非表示のフォームがレストラン コントローラーに送信され、次にモデル 2 に送信され、ユーザー名と彼が食べたレストランが記録されます。

「ここで食べた!」を使いたい!ボタンをクリックして、レストラン名のステータス更新をモデル 1 にも投稿します。

これは fields_for で行う必要がありますが、2 つのモデルは互いに関係がありません..なるほど..

どうすればこれを実現できますか?

これが私のペーストリーです: http://www.pastie.org/1280923

それが明確であることを願っています!

4

1 に答える 1

1

「フォームをモデルに提出する」というようなことはありません。フォームは常にコントローラーに送信されます。

そのことを念頭に置いて、コントローラーのcreateorupdateメソッドをオーバーライドするだけで、必要なアクションを実行できます。

コントローラーは次のようになります。

class RestaurantsController < ApplicationController
  def update
    @restaurant = Restaurant.find(params[:id])
    unless @restaurant.update_attributes(params[:restaurant])
      # error while saving: warn user, etc
      return # stops execution
    end

    # restaurant was saved ok, do the additional things you want
    StatusUpdate.create :user_id => @restaurant.user_id, 
                        :comment => "I just ate @ #{@restaurant.name}"

    flash[:notice] = 'Restaurant was successfully updated, and a status update was added.'
    redirect_to :action => 'list'
  end
end

ただし、シナリオが見た目ほど単純な場合は、モデルで ActiveRecord コールバックを使用してこれを解決することもできます。

class Restaurant < ActiveRecord::Base
  after_save :append_status_update

  private

  def append_status_update
    StatusUpdate.create :user_id => self.user_id, 
                        :comment => "I just ate @ #{self.name}"
  end
end
于 2010-11-08T07:20:37.887 に答える