使参数以相同的方式被两个动作访问。参数[:用户][:表单]

Make parameter accessible by two actions in same way. params[:user][:form]

路线:

编辑动作: /profiles/edit?form=address

控制器

before_action :form_type, only: %i[edit update]

def edit
end

def update
end

def form_type
     @form_type = params[:form] || params[:user][:form]
end

查看

<%= simple_form_for current_user, url: profiles_path, wrapper: :input_group  do |f| %>
                <%= render_user_form(f, @form_type, self) %>
                <%= f.input :form, as: :hidden , :input_html => {value: @form_type} %>
                <div class="action">
                  <%= f.submit 'Update', class: ''%>
                </div>
<% end %>

当我的参数传递到控制器时,在编辑页面上,它传递到 params[:form],但对于更新操作,它可以作为 params[:user][:form] 访问。我如何让编辑页面也使参数可访问的方式与.. params[:user][:form].

我更喜欢以 params[:user][:form] 的形式访问,而不是以 params[:form] 的形式进行访问,如果可能的话。

已更新 @Max 的更正

您的问题是如何将参数传递给 edit 控制器操作(这是一个 GET 请求)与表单如何将参数传递给 update 控制器操作(这是一个 GET 请求) POST 请求,因此表单值在请求正文中)。

对于 GET 请求,您传递给 ? 的所有内容都会“参数化”。

当您通过 /profiles/edit?form=address 时,然后 params[:form] 可用。

当您的表单提交时,表单生成器通过使用 model_name[attribute] 约定命名它们来创建嵌套输入。

要实现你所要求的,你可以做到 /profiles/edit?user[form]=address

恕我直言,你应该在两种情况下都做 params[:form] 而不是 params[:user][:form]

您可以通过不使用 simple_form 助手在您的部分中获得 params[:form]

尝试使用标准 text_field_tag 而不是 f.field 标签。确保将 HTML 名称值设置为 form:

text_field_tag 'form' @form_type

然后在渲染视图时,您应该会看到如下内容:

你有: <input id="user_form" name="user[form]" type="text" />

你想要什么: <input id="form" name="form" type="text" />

此外,我建议将您的参数切换为 form_type,因为 SimpleForm 可能会使用 #user_form 作为表单的 ID (<form id="user_form" ...>),这会使任何 Javascript 按 ID 查找会发生冲突。

Rails(从技术上讲是它的 Rack)通过 name 属性嵌套输入。因此,如果您提交此表单:

<form action="/somepath">
  <input name="foo" value="1" type/>
  <input name="bar[baz]" value="2" type/>
  <input name="moo[woo]" value="3"/>
  <input type="submit" value="send">
</form>

您将获得以下参数哈希:

{ 
   foo: 1,
   bar: {
     baz: 2
   },
   moo: {
     woo: 3
   }
}

原始参数如下所示:

foo=1&bar[baz]=2&moo[woo]=3

Rack 以相同的方式处理这些参数,无论它们是通过查询字符串还是在表单正文中发送。

因此,如果您想在查询中将密钥作为 params[:user][:form] 传递,您需要 url /profiles/edit?user[form]=address

您可以通过以下方式创建 link:

# Im just guessing the name of the helper
<%= link_to 'Edit', profiles_edit_path(user: { form: 'address' }) %>

首先,我相信form类型(地址,我想知道其他选项是什么?个人资料,帐户,详细信息......)不会保存给用户,它只是一个参数你控制器端需要知道要更新配置文件的哪一部分(恕我直言,在配置文件中保存 form 参数没有意义)。所以我猜你有某种多页表格并以这种方式解决。

恕我直言,最简单的方法是保持 url 不变,并在您的表格中写下:

<%= simple_form_for current_user, url: profiles_path, wrapper: :input_group  do |f| %>
  <%= render_user_form(f, @form_type, self) %>
  <%= hidden_field_tag :form, @form_type %>
  <div class="action">
    <%= f.submit 'Update', class: ''%>
  </div>
<% end %>

这将添加一个隐藏字段,但不在用户上下文中,因此它只是 params[:form]。这个我相信会更正确。

其次,我对你的方法有一些小意见:

  • 为什么不使用 profile 单数?恕我直言,您打算将用户发送到他们的个人资料(而且只有一个,对吗?)。在你的路线中你可以写resource :profile。请参阅 singular resource 的文档(巧合地使用了配置文件示例)
  • 为什么不对配置文件的不同部分使用嵌套资源:这也可以更自然地映射到您的数据模型(或者也许应该):用户有一个地址(可能不止一个 --a当前,交货,发票,......),有额外的信息,然后你的 url 看起来像 profile/address/edit(然后你就不必处理 render_user_form表格类型太笨拙了)。