ruby-on-rails - 以相同的方式使两个操作可以访问参数。参数[: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] 的形式访问这两个操作。
解决方案
首先,我相信form
-type(地址,我想知道其他选项是什么?配置文件,帐户,详细信息......)没有保存给用户,它只是你需要在控制器端知道哪个部分的参数要更新的配置文件(恕我直言,将form
参数保存在配置文件中没有意义)。所以我猜你有某种多页表单并以这种方式解决它。
好吧,恕我直言,最简单的方法是保持你的网址不变,并在你的表格中写:
<%= 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
. 请参阅单一资源的文档(巧合地使用了配置文件示例) - 为什么不将嵌套资源用于配置文件的不同部分:这也可以更自然地映射到您的数据模型(或者可能应该):用户有一个地址(并且可能不止一个 - 一个当前的,一个交付,发票,...),有额外的信息,然后你的 url 看起来像
profile/address/edit
(然后你就不必render_user_form
用表单类型来处理了)。
推荐阅读
- spring-cloud - spring cloud stream和gcp pub sub,binder问题
- testing - 没有 LocalTesting 的 BrowserStack 上的 TestCafe?
- spring-cloud - 您将如何配置 Spring Cloud 的 SQS 消息侦听器容器的多种配置?
- system-verilog - 为 UVM 后门访问添加自定义延迟
- php - 在 Symfony 中使用 Doctrine DBAL 模式表示
- itext - Itext:属性:不推荐使用具有字符串类型值的 FONT 属性
- javascript - 基于键的流对象值
- perl - 我可以用一个完整的词来分割一个字符串吗?
- android - 从 ActionBarSherlock 更新到 AppCompatActivity 时出现 NoSuchFieldError
- excel - 当没有任何 ID 时,如何使用 VBA Selenium 正确定位 CSS 按钮元素?