未经许可的参数simple_form

时间:2017-01-02 12:44:58

标签: ruby-on-rails simple-form

我正在尝试使用ruby 4中的Simple_fields创建一个嵌套表单。

但是,每次我尝试在表单中输入数据时,我都会在尝试提交后在服务器控制台中收到未经许可的参数错误。

我已经尝试过在simple_form wiki中找到的解决方案并进行了一些测试,但这似乎不起作用。

_form:

<%= simple_form_for(@enquiry) do |f| %>
    <%= f.error_notification %>

    <div class="form-inputs">
      <H1>Algemene informatie</H1>

      <%= f.input :reference, placeholder: 'Referentie' %>
      <br>

      <%= f.label :Locatie %>
      <%= f.select :location, [['Chemiepark', 'chemiepark'], ['Farmsum', 'farmsum'], ['Winschoten', 'winschoten']] %>

      <br>
      <%= f.input :description, placeholder: 'Omschrijving' %>
      <br>
      <%= f.input :date %>
      <br>
      <%= f.input :amount, placeholder: 'Aantal' %>

    </div>

    <hr>
    <% if false %>
        <div class="form-inputs">
          <%= f.simple_fields_for :enquiry_measures do |e| %>

              <H1>Maatregelen</H1>

              <%= e.input :responsible, placeholder: 'Verantwoordelijke' %>
              <br>
              <%# e.input :needed, as: :check_boxes,
                     collection: ["ja", "nee"] %>
          <% end %>
          <br>
        </div>
    <% end %>

    <div class="form-inputs">
      <%= f.simple_fields_for :tools do |t| %>
          <% @enquiry.tools.each do |tool| %>
              <%= field_set_tag 'Tool' do %>
                  <%= f.simple_fields_for "tool_attributes[]", tool do |tf| %>
                      <h1>Gereedschappen</h1>
                      <br>
                      <%= tf.input :handtool, placeholder: 'Handgereedschap' %>
                  <% end %>
              <% end %>
          <% end %>
      <% end %>

    </div>
    <div class="form-actions">
      <%= f.button :submit %>
    </div>
<% end %>

强大的属性加上我测试的内容:

def enquiry_params
      # was gegenereerd door de scaffold params.fetch(:enquiry, {})
      params.require(:enquiry).permit(:reference, :location, :description, :date, :amount,
                                      :enquiry_measures_attributes => [:done, :responsible, :needed], :tools_attributes => [:handtool] )
                                      #:enquiry_measures_attributes => [:done, :responsible, :needed])
                                      #enquiry_measure_attributes: [:done, :responsible, :needed] )

更新 来自模型的代码

class Enquiry < ActiveRecord::Base
  #ophalen van andere tabellen voor het formulier. Has_many is 1 op veel relatie
  #accepts_nested_attributes Nested attributes allow you to save attributes on associated records through the paren
  # de dere regel zorgt ervoor dat de maatregelen worden opgehaald via de tussentabel enquiry_measures.

  has_many :enquiry_measures, :class_name => 'EnquiryMeasure' #, inverse_of: :Enquiry
  accepts_nested_attributes_for :enquiry_measures, :allow_destroy => true

  has_many :measures, -> { uniq }, :class_name => 'Measure', :through => :enquiry_measures, dependent: :destroy
  accepts_nested_attributes_for :measures, :allow_destroy => false

  has_many :controls, :class_name => 'Control' #, inverse_of: :Enquiry

  has_many :applicants, :class_name => 'Applicant' #, inverse_of: :Enquiry

  has_many :agrees, :class_name => 'Agree' #, inverse_of: :Enquiry

  has_many :signatures, :class_name => 'Signature' #, inverse_of: :Enquiry
  accepts_nested_attributes_for :signatures, :allow_destroy => false

  has_many :tools, :class_name => 'Tool', :dependent => :destroy  #, inverse_of: :Enquiry
  accepts_nested_attributes_for :tools, :allow_destroy => true

  #:dependent => :destroy  zorgt ervoor dat de foreign record ook word verwijderd.

  #de instances van andere tabellen:

  e = Enquiry.new
  e.enquiry_measures.build(:enquiry_id => :id)
  e.measures.build


  # 28-11 MG de pagina's die in het form worden gebruikt.
  cattr_accessor :form_steps do
    %w(basic when measurements tool)
  end

  attr_accessor :form_step

  validates :reference, presence: true, if: -> { required_for_step?(:basic) }
  validates :amount, :date, presence: true, if: -> { required_for_step?(:when) }
  #validates :needed, presence: true, if: -> { required_for_step?(:measurements) }

  def required_for_step?(step)
    return true if form_step.nil?
    return true if self.form_steps.index(step.to_s) <= self.form_steps.index(form_step)
  end

  #voor het mailen met behulp van de mailgem:
  # Declare the e-mail headers. It accepts anything the mail method
  # in ActionMailer accepts.
  def headers
    {
        :subject => "My Contact Form",
        :to => "marco.groenhof@jpbgroep.nl",
        :from => %("#{name}" <#{email}>)
    }
  end

end

和1个相关模型:在本例中为enquiry_measure

class EnquiryMeasure < ActiveRecord::Base
    belongs_to :enquiry
    validates_presence_of :enquiry
    has_many :measure
#serialize zodat de data uit de collection select met multiple: true op kan worden geslagen.
    serialize :measure

end

和工具:

class Tool < ActiveRecord::Base
  belongs_to :enquiry, :class_name => 'Enquiry' #, inverse_of: :applicant
  validates_presence_of :enquiry
end

我知道不再需要class_name了。

更新

记录:

 Parameters: {"utf8"=>"✓", "authenticity_token"=>"i3YukMoOaYEuUdxk6kmhoQ5q9uLQHHISW+NAU/L+kNjSwMZERmdIIVXZvJUh0vTnEPidaMvMEIlVT/aTlkTNPw==", "enquiry"=>{"reference"=>"Test", "location"=>"chemiepark", "description"=>"3ro0qjhrojeofj", "date(1i)"=>"2017", "date(2i)"=>"1", "date(3i)"=>"3", "amount"=>"2", "tools_attributes"=>{"0"=>{"handtool"=>"Hamer"}}}, "commit"=>"Create Enquiry"}

我看到的唯一奇怪的事情是&#34; tools_attributes&#34; =&gt; {&#34; 0&#34; =&gt; {&#34; handtool&#34; =&gt;&#34;哈默&#34;}}} 为什么那里有0?它可能是id,因为这对我无法保存的原因有意义。

只是为了确保,这是工具表和外键:

 add_index "tools", ["enquiry_id"], name: "index_tools_on_enquiry_id", using: :btree

  create_table "users", force: :cascade do |t|
    t.string   "name",            limit: 255
    t.string   "email",           limit: 255
    t.string   "password_digest", limit: 255
    t.datetime "created_at",                  null: false
    t.datetime "updated_at",                  null: false
  end
  add_foreign_key "tools", "enquiries"

更新4/01 刚刚安装了rails面板,看看会说些什么,但我一直认为问题在参数范围内:

{"reference":"test","location":"chemiepark","description":"iwopjf","date(1i)":"2017","date(2i)":"1","date(3i)":"4","amount":"2","tools_attributes":{"0":{"handtool":"hamer"}}}

为什么一直发送0?我怀疑它是工具ID,它会声明无法保存。

2 个答案:

答案 0 :(得分:0)

尝试将您的强参数设为

params.require(:enquiry).permit(:reference, :location, :description, :date, :amount, enquiry_measures_attributes: [:id, :done, :responsible, :needed, :_destroy], tools_attributes: [:id, :handtool, :_destroy] )

您正在嵌套的模型应该如下所示。尝试一次。

class Tool < ActiveRecord::Base
  # For a while let's not have any validation.
end

希望这对你的情况有用,因为我为自己解决了这个问题。

答案 1 :(得分:0)

我决定更新这个问题,因为我得到了帮助我的答案。它可能不是完全正确的答案,但我设法通过在Rails上使用uby中的默认form_for来解决我的问题。更多的编码工作,但它确实有效。