【问题标题】:Rails conditional form_form controller and action parametersRails 条件 form_form 控制器和动作参数
【发布时间】:2018-08-19 18:43:28
【问题描述】:

也许我在这里违反惯例,但我有一个由多个控制器使用的表单,我想自定义提交操作的发送位置。

我试过了:

<% if local_assigns.has_key? :form_type %>
  <% form_type = local_assigns[:form_type] %>
<% end %>
<% if local_assigns.has_key? :form_action %>
  <% form_action = local_assigns[:form_action] %>
<% end %>

<%= form_for :my_form, url: { controller: form_type, action: form_action } do |f| %>
# OR #
<%= form_for :my_form, url: { controller: "#{form_type}", action: "#{form_action}" } do |f| %>

类似的东西:

<% if form_type == 'type_A' %>
  <%= form_for :my_form, url: { controller: 'controller_A', action: 'action_A' } do |f| %>
<% elsif form_type == 'type_B' %>
  <%= form_for :my_form, url: { controller: 'controller_B', action: 'action_B' } do |f| %>
<% elsif form_type == 'type_C' %>
  <%= form_for :my_form, url: { controller: 'controller_C', action: 'action_C' } do |f| %>
<% end %>

两者都不起作用,第二个原因很明显。任何解决方法?我应该改用 form_tag 吗?并非我所有的形式都与对象相关联。我还试图避免将此模板嵌套在另一个模板中(包含正确 form_for 参数的外部模板)。作为最后的手段,我想我可以使用原始的 html 表单。

BONUS ...尚未到达那里,但我可能还需要修改 form_for 键,在本例中为“my_form”(上图)。

【问题讨论】:

  • 是普通形式吗?如果是,那你为什么不做一个共同的部分呢?并将基本参数作为方法、url、对象传递给本地人?有条件的
  • 也许我不明白你的逻辑。表单元素几乎完全相同(有一些小的调整),只是需要处理表单的不同控制器/动作。你能举例说明你的建议吗?现在,form_controller 和 form_action 作为参数传入(参见 local_assigns)。
  • 按照我的说法,我会将所有表单字段和提交按钮放在一个部分中,然后使用自己的form_for 在每个模板中呈现该部分。它将节省很多复杂性。
  • @user58446 请看下面的例子。

标签: ruby-on-rails templates conditional-statements form-for ruby-on-rails-5.2


【解决方案1】:

为常见的表单示例制作一个常见的部分

_common_partial.html.erb

<%= form_for object, url: url do |f|%>
  #.. form fields
<%end%>

有条件地渲染这个部分

<% if form_type == 'type_A' %>
  <%= render 'path/common_partial', object: form_for_object, url: path_to_which_form_be_submitted%>
<% elsif form_type == 'type_B' %>
  <%= render 'path/common_partial', object: form_for_object, url: path_to_which_form_be_submitted%>
<% elsif form_type == 'type_C' %>
  <%= render 'path/common_partial', object: form_for_object, url: path_to_which_form_be_submitted%>
<% end %>

【讨论】:

  • 为什么有三个不同的代码路径来做完全相同的事情,而不是if ['type_A', 'type_B', 'type_C'].include?(form_type)
  • 我想事情的方式,也许是错误的,我会调用正确的布局,只有 form_for 行、一个 end 和 render: partial(包含表单字段)之间。那行得通吗?在这种情况下,我试图重用表单字段。在您的示例中,我必须为每个部分复制所有 form_fields。
  • @user58446 那么每个表单中有不同的字段吗?
  • 对不起,不是不同的表单字段,只有 html 略有不同(没有什么我不能用条件轻松处理)......还有 form_for 的控制器/操作。
  • 在这种情况下,我似乎应该为我需要的每个 form_for 设置一个不同的部分,然后让它们都使用我所需要的任何参数调用同一个子部分(包含表单字段和 html)想要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多