アプリのビジネス ロジックを見てみましょう。実装する必要がある 2 つのストーリーがあります。
1)ユーザーは広告(オファー)を作成できます(そのため、広告にuser_idを追加しました)
2) そして、ユーザーは広告に入札できます (これは単純な has_many :関連付けによるものです)
class User < ActiveRecord::Base
has_many :bids
has_many :advertisements, :through => :bids
has_many :offers, class_name: "Advertisement", foreign_key: :user_id
end
class Advertisement < ActiveRecord::Base
belongs_to :author, class_name:"User", foreign_key: :user_id
has_many :bids
has_many :users, :through => :bids
end
class Bid < ActiveRecord::Base
belongs_to :user
belongs_to :advertisement
end
したがって、広告の作成者を取得したい場合は、電話する必要があります
a = Advertisement.last
a.author
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
=> #<User id: 1, created_at: "2013-05-31 06:13:20", updated_at: "2013-05-31 06:13:20">
a.users
User Load (0.1ms) SELECT "users".* FROM "users" INNER JOIN "bids" ON "users"."id" = "bids"."user_id" WHERE "bids"."advertisement_id" = 2
=> [#<User id: 1, created_at: "2013-05-31 06:13:20", updated_at: "2013-05-31 06:13:20">, #<User id: 1, created_at: "2013-05-31 06:13:20", updated_at: "2013-05-31 06:13:20">]
ほら、入札に参加して最後の選択を行いますが、最初の選択はユーザーテーブルから選択するだけです。これで、期待どおりに動作します。
とにかく、あなたの質問に答える:
はい、次のように新しいルートを定義する必要があります。
resources :advertisements do
member do
post 'bid'
end
end
それを行う AdvertisementsController でカスタム アクションを作成する必要があります。
def bid
@advertisement = Advertisement.find(params[:id])
current_user.bids << Bid.new(advertisement: @advertisement, value: params[:bid])
# you may also add some value column in bids table, thats up to you
redirect_to @advertisement
end
フォームは次のようになります。
<%= form_tag(bid_advertisement_path(@advertisement), :method => "post",) do %>
<%= label_tag(:bid, "Make a bid:") %>
<%= text_field_tag(:bid) %>
<%= submit_tag("Submit") %>
<% end %>