0

我正在构建一个带有工作板的 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 create 方法时遇到问题) - 在 session 变量中传递 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 %>
4

3 回答 3

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
于 2013-05-31T04:56:03.763 回答
1

我是一个 Rails 新手,但我认为而不是说

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

我希望应该这样做,就像我说我是新手,可能在这方面是错误的。

于 2013-05-31T05:27:01.477 回答
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
于 2013-05-31T06:12:25.747 回答