首页 > 解决方案 > 以相同的方式使两个操作可以访问参数。参数[: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] 的形式访问这两个操作。

标签: ruby-on-railsrubyruby-on-rails-5.2

解决方案


首先,我相信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用表单类型来处理了)。

推荐阅读