Rails中如何为simple_form的新建、编辑操作分别指定URL
问题根因
你传局部变量失败是Haml渲染局部模板的语法使用错误:当使用render '模板名'的简写语法时,局部变量可以直接作为键值对写在后面,不需要额外包裹locals: {}。你套了locals层之后,模板内只会识别到名为locals的变量,自然读不到单独的url和http_action参数。
修正方案
第一步:修改两个页面的渲染调用
去掉多余的locals包裹,直接传参:
- 新建页面的渲染代码:
.mt-5 = render 'form', url: partner_campaigns_path(@partner), http_action: :post
- 编辑页面的渲染代码:
.mt-5 = render 'form', url: campaign_path(@campaign), http_action: :patch
如果你习惯显式写locals的传参格式,必须同时显式声明partial参数,不能省略,写法如下,效果和上面一致:
= render partial: 'form', locals: { url: campaign_path(@campaign), http_action: :patch }
第二步:修改共用表单模板
在_form.html.haml里直接使用传入的参数即可:
= simple_form_for(@campaign, as: :campaign, method: http_action, url: url) do |f| -# 此处放所有共用的表单输入项 = f.input :name -# 其余表单项、提交按钮保持原有逻辑即可
补充:实际上你不需要手动传http_action参数,Simple Form会自动判断@campaign对象是否已持久化:未持久化的新建记录自动用post方法,已持久化的编辑记录自动用patch方法,你只需要传入对应场景的url参数就能满足需求。
内容的提问来源于stack exchange,提问作者Dan Rubio
相关产品推荐
相关产品推荐

