使参数可以通过两种方式以相同方式访问。 params [:user] [:form] 路线:查看要实现您的要求,您可以执行/profiles/edit?user[form]=address

路线:

编辑动作: /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]进行访问。

gukoule 回答:使参数可以通过两种方式以相同方式访问。 params [:user] [:form] 路线:查看要实现您的要求,您可以执行/profiles/edit?user[form]=address

首先,我相信swipl.exe类型(地址,我想知道其他选项是什么?个人资料,帐户,详细信息...)不会保存给用户,它只是您需要的一个参数控制器方知道要更新配置文件的哪一部分(恕不建议在配置文件中保存form参数)。因此,我猜您有某种多页表单,并且可以通过这种方式解决。

恕我直言,最简单的方法是保持url不变,并在表单中输入:

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。请参阅singular resource的文档(同时使用配置文件示例)
  • 为什么不对配置文件的不同部分使用嵌套的资源:这也可以更自然地映射到您的数据模型(或者应该映射):用户有一个地址(当前可能有多个地址,交货,开具发票...)具有额外的信息,然后您的网址看起来就像resource :profile(这样您就不必笨拙地使用表单类型来处理profile/address/edit)。
,

轨道(从技术上讲,它是机架)按名称属性嵌套输入。因此,如果您提交以下表格:

test[is.na(test)] <- Inf
test$G5 <- c("No","Yes")[(rowSums(test > 5) == ncol(test))+ 1]

您将获得以下参数哈希:

<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
   }
}

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

因此,如果您要在查询中将密钥作为foo=1&bar[baz]=2&moo[woo]=3 传递,则需要URL params[:user][:form]

您可以通过以下方式创建链接:

/profiles/edit?user[form]=address
,

已更新@Max更正

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

对于GET请求,您经过?的所有内容都会被“参数化”。

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

提交表单时,表单构建器通过使用model_name[attribute]约定来命名嵌套输入。

要实现您的要求,您可以执行/profiles/edit?user[form]=address

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

通过不使用params[:form]助手,可以部分获得simple_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作为表单(<form id="user_form" ...>)的ID,这将使通过ID获得的所有Javascript查找冲突。

本文链接:https://www.f2er.com/3047303.html

大家都在问