在我的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'} %>
这似乎不起作用,虽然它确实正确链接到新的付款页面。
有更简单的方法吗?
答案 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] ...