[英]Rails 3 Saving with Multiple Associations
我正在構建一個帶有工作板的Rails 3應用程序,工作人員可以在其中提交工作投標。 我有以下協會:
Job:
has_many :bids
has_many :workers, :through => :bid
Bid:
belongs_to :job
belongs_to :worker
Worker:
has_many :bids
has_many :jobs, :through => :bid
我在“顯示工作”頁面上有一個表單,工作人員可以在其中提交出價。 在控制器中,我有以下內容:
Job Controller:
def show
@bid = current_worker.bids.build
end
Bid Controller:
def create
@bid = current_worker.bids.build(params[:bid])
@bid.save
end
使用上面的代碼,提交的出價將無法正確保存,因為它缺少job_id:
1)使用job_id和worker_id保存出價的正確方法是什么?
2)(我無法將job_id從作業控制器show方法傳遞給Bid Controller創建方法) - 在會話變量中傳遞job_id是否安全?
作為參考,出價表格如下:
<%= form_for(@bid) do |f| %>
<%= f.label :min_price, "Minimum Price" %>
<%= f.text_field :min_price %>
<%= f.label :fee %>
<%= f.text_field :fee %>
<%= f.label :comments %>
<%= f.text_area :comments, placeholder: "Comments..." %>
<%= f.submit "Post", class: "btn btn-large btn-primary" %>
<% end %>
代碼取決於您想要的安全性,我想您希望獲得current_worker
無法出價的受保護作業,因此您需要這似乎不依賴於出價,而是取決於工作。
在您首次創建出價時,您可以在表單中或作為路徑的一部分傳遞job_id。
如果你想拒絕一個工人競標任何工作你可以做這樣的事情:
Bids Controller:
def create
job = Job.find(params[:job_id])
if current_worker.can_bid? job
@bid = current_worker.bids.build params[:bid]
else
# handle unauthorised bidding
在工人模型中,這只是一個例子:
def can_bid?(job)
# Implement code here
# example:
# job.public? or invited_to?(job)
end
# example of invited_to?(job)
def invited_to?(job)
job.invitees.include? self
end
我不確定這是否能回答你的問題。
我想你可以用它來傳遞路線中的工作ID:
resources :jobs do
resources :bids
end
= form_for @job, @bid ...
與第一次沒有@job一樣,您可以使用:
= form_for :job, @bid
我是鐵桿新手,但我想而不是說
<%= form_for(@bid) do |f| %>
嘗試
<%= form_for(@job, @bid) do |f| %>
然后在您的出價控制器中,新操作會執行此類操作
def new
@job = Job.find(params[:job_id])
@bid = @job.bids.build
end
然后在您的路線中,您應該將出價嵌套在作業資源之下
resources :jobs do
resources :bids
end
應該這樣做我希望,就像我說我是一個新手,可能是錯的。
只需檢查您的型號出價。 它與兩個型號相似。 所以你必須把它作為多態表。 重新構建模型如下
Bid:
belongs_to :bidable, polymorphic: true
Job:
has_many :workers, :through => :bid
has_many :bids, :as => :bidable
Worker:
has_many :bids, :as => :bidable
has_many :jobs, :through => :bid
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.