0

在我的 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'} %>

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

有没有更简单的方法?

4

1 回答 1

4

在我的脑海中,未经测试,我认为以下方法会起作用:

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

在 url 助手中添加一个哈希只是将参数放在 url 上,这将由 rails 解释,就像从表单发布的“正常”参数一样。

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


更新:再次阅读您的问题,您想要已设置 claim_id 的新付款表格吗?

好的,有很多方法可以做到这一点。如果您将参数传递给新操作,您可以从参数中获取 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] ...
于 2012-11-20T19:58:20.587 回答