使用自动belongs_to关系链接到新记录?

时间:2012-11-20 19:16:20

标签: ruby-on-rails-3 model relationship belongs-to

在我的Rails 3应用程序中,我有一个简单的模型关系,如下所示:

动物模型

has_many :claims

声明模型

belongs_to :animal
has_many :payments

付款模式

belongs_to :claim

索赔表有一个名为animal_id的列,付款表有一个名为claim_id的列。

我可以成功列出索赔所拥有的所有付款。

我要做的是在动物节目视图中添加一个链接,该链接会创建一个已设置animal_id的新声明,并与新付款链接的声明显示视图相同。

根据我的阅读,你可以手动创建一个带控制器和动作集的link_to,如下所示:

声明显示视图

<%= link_to 'Create a Payment', {:controller => "payments", :action => "new", :claim_id => '@claim.id'} %>

这似乎不起作用,虽然它确实正确链接到新的付款页面。

有更简单的方法吗?

1 个答案:

答案 0 :(得分:4)

脱离我的头脑,并且未经测试,我认为以下方法可行:

= link_to 'Create Payment', payments_path(:payment=>{:claim_id=>@claim.id}), :method => :post

在url helper中添加一个hash只是将params放在url上,这将由rails解释,就像从表单中发布的“normal”params一样。

这相当于提交一个新的付款表单,因此它会以相同的方式重定向。如果您希望通过ajax处理它,只需添加:remote => true,并确保您的PaymentsController上的创建操作正确响应javascript。


更新:再次阅读您的问题,您是否需要设置claim_id的新付款表单?

好的,有很多方法可以做到这一点。如果你将params传递给新的动作,你可以从params获取claim_id,就像我上面创建的记录一样:

= link_to 'New Payment', new_payment_path(:claim_id=>@claim.id)

这会将您链接到/ payments / new?claim_id = 123

然后在你的控制器中:

def new
  @payment = Payment.new(:claim_id => params[:claim_id])
end

然而,正如评论中指出的那样,更好的方法是在索赔下嵌套付款:

在您的路线中:

resources :claims do
  resources :payments
end

在PaymentsController中:

before_filter :load_claim

def new
  @payment = @claim.payments.build
end

def create
  @payment = @claim.payments.build(params[:payment])
  ...
end

private
def load_claim
  @claim = Claim.find(params[:claim_id])
end

在您的链接中:

= link_to 'New Payment', new_claim_payment_path(@claim)

请注意,现在您的付款路径助手需要声明,即:

= link_to 'Payment', claim_payment_path(@claim, payment)

表单助手也一样:

= form_for [@claim, @payment] ...