2013-05-31 76 views
0

我正在構建一個Rails 3應用程序,其中有一個工作板,工作人員可以在其中提交工作投標。我有以下協會: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從Job Controller 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 %> 
+0

你的'bids_controller#create'方法不應該調用'new'而不是'build'嗎?爲什麼不在你的'form_for(@bid)'中簡單地添加'<%= f.hidden_​​field:job_id,@ job.id%>'? – coreyward

+0

將job_id作爲隱藏字段傳遞不安全/安全。提交表單時,用戶可以使用螢火蟲或其他程式來更改job_id。 – Krishna

+0

如果他們可以競標任何工作,那麼這並不重要。如果在作業ID方面有限制,你可能應該在服務器端進行驗證。 – coreyward

回答

1

代碼取決於你想要什麼樣的安全,我想你想得保護工作,其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 

在worker模式,這僅僅是一個例子:

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 
+0

Juanpastas - 我如何將job_id作爲路線的一部分而不是形式? – Krishna

1

我是一軌新手,但我認爲,與其說

<%= 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 

應該這樣做我希望,就像我說過的,我是一個新手,可能是錯誤的。

0

只需檢查您的模型出價。它記錄到兩個模型。所以你必須把它作爲多態表。重構你的模型如下

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 
+0

我看到了 - 我閱讀了多態表,它是有道理的。但是,一旦我進行了修改建議,如何修改作業控制器和出價控制器(如果需要,還可以使用表單),創建新的出價,同時保存job_id和worker_id而不使用隱藏表單來存儲ID? – Krishna