2015-10-07 86 views
1

我有一个has_many提供的工作模型,用户可以接受或拒绝这些提议,但是当用户接受提议时,我怎么能这样做,无法创建更多优惠?我试图以这种方式做到这一点,它的工作原理,但它重复输入框。所以我做错了什么,或者我该如何做另一种方式?Rails小循环错误

#show.html.haml 
- if @job.offers.blank? 
    = render 'offers/form' 

- @job.offers.each do |f| 
    - if @job.offers.find(f).status == false || @job.offers.find(f).status == nil 
    = render 'offers/form' 
    - else 
    cannot do that 

#offers/_form.html.haml 
= simple_form_for([@job, @job.offers.build]) do |f| 
    = f.input :pirce_offer 
    = f.button :submit 
+0

当您遍历'@ job.offers'时,该循环中的每个'f'都是'offer'。 (请使用描述性变量名称,例如“offer”,它使事情变得更加可读)。然后你做'if @ job.offers.find(f).status' - 这很奇怪。你为什么再看一遍?为什么不直接说'if f.status == false'?另外,你可以使用'if f.status.blank?'而不是测试它是否等于false或nil。 –

+0

哦,没错。但是当我测试'f.status == false || f.status == nil || f.status.blank?',它不起作用,我的意思是'form'不是呈现,当'status.blank?' – exerq

回答

1

您需要将自己等于scoping in programming;每当你在Ruby中创建一个“块”,它本质上是一样调用一个函数,用its own local scope

- @job.offers.each do |f| 
    - if f.status == false || f.status == nil 
    = render 'offers/form' 
    - else 
    cannot do that 

顺便到这一点,我没有得到调用的是建立一个新的报价形式的目的是什么?

你通过工作的要约循环使用状态条件来确定用户是否应该创建一个要约或不....呢,当然,如果要约存在,用户已经发布优惠?

此外,您使用的形式完全新的一组数据:

= simple_form_for([@job, @job.offers.build]) do |f| 
    = f.input :pirce_offer 
    = f.button :submit 

你不是应该使用类似以下内容:

= simple_form_for([@job, f]) do |f| 
    = f.input :pirce_offer 
    = f.button :submit 

好吧,我得到它 - 你有一种“拍卖”系统,其中优惠被接受/拒绝。如果以前被拒绝,这会让你有能力做出新的提议...........它仍然是粗略的地狱。


我该怎么做,当用户接受的报价,更优惠不能创建

你需要使用一些验证您的视图和模型。

事情是这样的:

#app/models/offer.rb 
class Offer < ActiveRecord::Base 
    validates :user_id, uniqueness: { scope: :job, message: "Only one offer per job" } 
end 

如果你描述你希望如何/提供就业机会的工作,我可以创造一个更完整的答案。

+0

谢谢,我想这样做:用户(卖方)可以创建'作业' ,这个工作的用户(买家)可以创建'offer',当卖家接受'offer'时,阻止为这个'工作'提供新的'offer'的能力。 – exerq