【发布时间】: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