使参数以相同的方式被两个动作访问。参数[:用户][:表单]
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
表格类型太笨拙了)。
路线:
编辑动作:
/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
表格类型太笨拙了)。