0

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

我的报价如下所示:

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部分的底部有一个用于创建新报价的按钮:

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

我保存到参数以在控制器中识别用户单击按钮的页面。

为了处理这些不同的要求,我构建了两种不同的表单,它们在我的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] 时才会呈现表单

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

有人可以给我一个关于如何处理这个问题的提示或链接吗?

4

1 回答 1

1

最简单的做法是将源代码添加为以下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 %>

这样您就可以访问 params[:source] 并解决您的问题。

于 2021-03-03T14:15:58.817 回答