我如何将一个特定的url传递给simple_form用于新建和编辑操作



我试图呈现一个简单的表单来创建和编辑campaign资源。通常,在rails应用程序中,我会像这样呈现表单:

<%= simple_form_for @campaign do |f| %>
....inputs.....
<% end %>

通常,这足以为campaign执行新操作和编辑操作。但是在这个场景中,我不能使用相同的方法,因为无法推断new和edit的url。它们是两个不同的url。下面是我的代码:

New Action
.max-w-4xl.mx-auto
.mt-5.bg-white.shadow.sm:rounded-lg
.px-4.py-5.sm:p-6
%h3.text-lg.leading-6.font-medium.text-gray-900
New Campaign
.mt-5
= render 'form'
Edit Action
.max-w-4xl.mx-auto
.mt-5.bg-white.shadow.sm:rounded-lg
.px-4.py-5.sm:p-6
%h3.text-lg.leading-6.font-medium.text-gray-900
Editing Campaign: "#{@campaign.name}"
.mt-5
= render 'form'
对于新的动作,我有一个简单的表单编码如下:

= simple_form_for(@campaign, as: :campaign, method: :post, url: partner_campaigns_path(@partner)) do |f|

对于编辑操作,我有这样一个简单的表单:

= simple_form_for(@campaign, as: :campaign, method: :patch, url: campaign_path(@campaign)) do |f|

我想保持我的_form.html.haml,但我似乎不能传递不同的url到它。我试图通过url和动作作为局部变量渲染部分,但他们似乎总是空白。在下面的例子:

= render 'form', locals: { url: campaign_path(@campaign), http_action: :patch }

每次我做这种方法的变化,我不能得到urlhttp_action变量。我做错了什么吗?

您可以使用#new_record?#persisted?方法来实现此

- http_method = @campaign.new_record? ? :post : :patch
- url = @campaign.new_record? ? partner_campaigns_path(@partner) : campaign_path(@campaign)
= simple_form_for(@campaign, as: :campaign, method: http_method, url: url) do |f|

或者您可以将此逻辑封装在helper方法

module ApplicationHelper
def resolve_form_options(campaign, partner)
if campaign.new_record?
{ url: partner_campaigns_path(partner), method: :post }
else
{ url: campaign_path(campaign), method: :patch }
end
end
end
= simple_form_for(@campaign, as: :campaign, **resolve_form_options(@campaign, @partner)) do |f|

可以从呈现表单部分的新页面和编辑页面传递一个变量。如果从新视图传递,则类似-<%= render 'form', request_method: 'new' %>。然后在form partial中,你可以输入-

= simple_form_for(@campaign, as: :campaign, method: request_method == 'new' ? :post : :patch, URL: (request_method == 'new' ? partner_campaigns_path(@partner) : campaign_path(@campaign) )) do |f|.

我认为这可能不是正确的方法,可能是更好的方法。如果答对了,请把答案标记为正确。:)

相关内容

  • 没有找到相关文章