如何根据在 Rails 6 中调用表单的位置构建具有不同输入数据的表单?

How to build a form which has different input data depending on where the form was called in Rails 6?

我正在使用报价模型将报价详细信息保存到数据库中。

我的出价是这样的:

class Offer < ApplicationRecord
  belongs_to :company
  belongs_to :product
  belongs_to :clerk, optional: true
end

订单 _index.html.erb 部分在公司的 show.html.erb 视图和 show.html.erb 查看产品。在订单 _index.html.erb partial 的底部有一个创建新报价的按钮:

<% if @company %>
  <%= link_to 'new offer', new_offer_path(@company, @offer, :source => "company"), :class => "btn btn-primary" %>
<% elsif @product %>
  <%= link_to 'new offer', new_offer_path(@product, @offer, :source => "product"), :class => "btn btn-primary" %>
<% end %>

我正在保存到 source 参数以在控制器中识别用户在哪个页面上单击了按钮。

为了处理这些不同的需求,我构建了两种不同的表单,这些表单在我的 new.html.erb

中呈现
<% if params[:source] == "company" || params[:product_id].nil? %>
    <%= render 'form_from_company', offer: @offer, company: @company %>
    <%= link_to 'Zurück', company_path(@company), :class => "btn btn-secondary" %>
<% elsif params[:source] == "product"%>
    <%= render 'form_from_product', offer: @offer, product: @product %>
    <%= link_to 'Zurück', product_path(@product), :class => "btn btn-secondary" %>
<% end %>

我的表格是这样的 (form_from_company):

<%= simple_form_for [@offer] do |f| %>
  <%= hidden_field_tag :company_id, @company.id %>
  <%= f.association :product, prompt: "Produkt auswählen", label_method: :name_and_product_autocomplete, input_html: {id: 'dropdown-choice-select'} %>
  <%= f.association :clerk, label_method: :full_name, collection: Clerk.where(company_id: @company.id), prompt: "Mitarbeiter auswählen" %>
...
  <%= f.button :submit, class: "btn btn-primary" %>
<% end %>

我的其他表格是这样的 (form_from_product):

<%= simple_form_for [@offer] do |f| %>
  <%= hidden_field_tag :product_id, @product.id %>
  <%= f.association :company, prompt: "Firma auswählen", label_method: :name_and_company_autocomplete, input_html: {id: 'dropdown-choice-select'}%>
...
  <%= f.button :submit, class: "btn btn-primary" %>
<% end %>

我什至让它像这样工作,但只是为了正确输入。 因此,如果用户输入了未经验证的错误数据,则会再次呈现新表单以向他显示他丢失的内容,这就是我的问题。

他第一次按下提交按钮后,没有包含 params[:source],它只显示“空的”新页面,因为只有在有 params[:source 时才会呈现表单]

我觉得应该有更好的解决方案,但我不知道如何以正确的方式去做。

有人可以给我提示或 link 如何处理这个问题吗?

最简单的做法是以两种形式将源添加为 hidden_field

<%= simple_form_for [@offer] do |f| %>
  <%= hidden_field_tag :source, value: 'company' %>
  <%= hidden_field_tag :company_id, @company.id %>
  <%= f.association :product, prompt: "Produkt auswählen", label_method: :name_and_product_autocomplete, input_html: {id: 'dropdown-choice-select'} %>
  <%= f.association :clerk, label_method: :full_name, collection: Clerk.where(company_id: @company.id), prompt: "Mitarbeiter auswählen" %>
...
  <%= f.button :submit, class: "btn btn-primary" %>
<% end %>
<%= simple_form_for [@offer] do |f| %>
  <%= hidden_field_tag :source, value: 'product' %>
  <%= hidden_field_tag :product_id, @product.id %>
  <%= f.association :company, prompt: "Firma auswählen", label_method: :name_and_company_autocomplete, input_html: {id: 'dropdown-choice-select'}%>
...
  <%= f.button :submit, class: "btn btn-primary" %>
<% end %>

这样你就可以访问参数[:source],你的问题就解决了。