2013-05-31 1 views
0

나는 노동자들이 작업에 대한 입찰을 제출할 수 있습니다 작업 보드와 레일 3 응용 프로그램을 구축하고 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 

나는 노동자들이 입찰을 제출할 수있는 표시 작업 페이지의 양식을 가지고 : 나는 다음과 같은 연결을 가지고있다. 는 작업 ID 없기 때문에 위의 코드는, 제출 된 입찰이 제대로 저장하지 않습니다와

Job Controller: 
    def show 
    @bid = current_worker.bids.build 
    end 

Bid Controller: 
    def create 
    @bid = current_worker.bids.build(params[:bid]) 
    @bid.save 
    end 

:

1) 입찰을 저장하는 올바른 방법은 무엇입니까 컨트롤러, 나는 다음을 둘 다 job_id와 worker_id로?

2) (필자는 입찰 컨트롤러 작업 컨트롤러 표시 방법에서 방법)을 작업 ID를 만들 통과 문제 데 -이 변수 응답 세션에서 작업 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' 메소드가'build' 대신'new'를 호출하면 안됩니까? 왜'<% = f.hidden_field : job_id, @ job.id %>'를'form_for (@bid)'에 추가하지 않으시겠습니까? – coreyward

+0

job_id를 숨겨진 필드로 전달하는 것이 안전하지 않거나 안전하지 않습니다. 사용자는 폼을 제출할 때 방화 녀 (firebug) 또는 다른 프로그램을 사용하여 job_id를 변경할 수 있습니다. – Krishna

+0

그리고 그들이 어떤 직업에 입찰 할 수 있다면 그것은 중요하지 않습니다. 작업 ID에 제한이있는 경우 어쨌든 서버 측에서 유효성을 검사해야합니다. – coreyward

답변

1

, 나는 당신이 current_worker이에 입찰을 할 수 없습니다 보호 작업을해야한다고 가정합니다, 그래서 당신은 것을 필요 대신 직장에 입찰에 의존하지 않는 것 같습니다.

먼저 양식 또는 경로의 일부로서, 작업 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 

내가 아니다 이것이 귀하의 질문에 대한 답변인지 확인하십시오. 당신은

경로

resources :jobs do 
    resources :bids 
end 

보기

= form_for @job, @bid ... 

처음에 당신이 @job가 ​​없습니다 :

난 당신이 경로에서 작업 ID를 전달하려면이 옵션을 사용할 수 있다고 생각 사용할 수 있습니다 :

= 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

모델 입찰을 확인하십시오. 그 두 모델에 belogs. 그래서 당신은 다형성 테이블로 만들어야합니다. 다음과 같이 모델을 구성하십시오.

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를 모두 저장하면서 새 입찰가를 만들려면 작업 컨트롤러와 입찰 컨트롤러 (및 필요한 경우 양식)를 어떻게 수정해야합니까? – Krishna