2017-01-02 3 views
0

Я пытаюсь создать вложенную форму с Simple_fields рубина 4.Самовольная параметр simple_form

Однако каждый раз, когда я пытаюсь ввести данные в форму я получаю ошибку Неразрешенного параметра в консоли сервера после попытки представить ,

Я уже пробовал решения, найденные в вики простой_формы, и провел некоторые испытания, но это, похоже, не работает.

_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 => "[email protected]", 
     :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 не очень нужен.

UPDATE

Каротаж:

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"} 

только странно, что я вижу это "tools_attributes" => { "0" => { "handtool" => "Хамер"} }} Почему это 0? Может ли это быть id, потому что это имеет смысл, почему я не могу сэкономить.

И просто чтобы убедиться, что это Tabel инструмент и внешний ключ:

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" 

UPDATE 4/01 Просто монтированы рельсы, чтобы увидеть, что это было бы сказать, но я продолжаю думать проблему находится в пределах параметров:

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

Почему он продолжает посылать это 0? я подозреваю, что это идентификатор инструмента, который объявит, что он не сможет сэкономить.

+0

Вам также нужно принять вложенные параметры из модели –

+1

, пожалуйста, напишите код из модели \ –

+0

Модели и протоколы были добавлены. – Marco

ответ

0

Я решил обновить этот вопрос, поскольку получил ответ, который мне помог. Возможно, это не совсем правильный ответ, но мне удалось решить мою проблему, используя форму по умолчанию для uby on Rails. Немного больше работы по кодированию, но он работает.

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 

Надеюсь, что это сработает в вашем случае, поскольку я исправлю это для себя.

+0

Здравствуйте, см. Код. Я уже пробовал это, без успеха. Он не дает никакой ошибки при регистрации, просто откатывается назад – Marco

+0

См. Параметры полностью, есть некоторая разница, чем ваша, и она работает в моем случае simple_form с вложенными значениями. Также принимайте вложенные параметры из модели. –

+0

Здравствуйте, У моделей уже есть accept_nested_params в них, так что это должно быть хорошо. Я также пробовал ваш код, но без успеха. Он по-прежнему не сохраняет, но с вашим кодом он также не дает ошибки, он просто откатывается. Вложенные атрибуты должны быть только в «основной» модели, не так ли? – Marco

Смежные вопросы