2015-06-08 3 views
0

У меня есть одна форма для сохранения в базе данных, но я хочу сохранить некоторые поля, которые будут сохранены в другой записи.Вложенные атрибуты формы

<%= form_for @complaint, url: {action: 'create'}, :html => {:multipart => true} do |f| %> 
    <%= f.text_field :complaint_info %> 
    <%= f.fields_for :witness do |witnesses_form| %> 
    <%= witnesses_form.text_field :name %> 
    <% end %> 
<% end %> 

В мой контроллер:

def new 
    @complaint = Complaint.new 
    end 

    def create 
    @complaint = current_user.complaints.build(complaint_params) 
    if @complaint.save 

     redirect_to dashboard_complaint_path(@complaint) 
    else 
     render 'new' 
    end 
    end 

    private 

    def complaint_params 
    params.require(:complaint).permit(:complaint_info, witnesses_attributes: [:name]) 
    end 

на модели:

class Complaint < ActiveRecord::Base 
    belongs_to :user 
    has_many :witnesses 
    accepts_nested_attributes_for :witnesses 
end 

.

class Witness < ActiveRecord::Base 
    belongs_to :complaint 
end 

Но я получаю эту ошибку:

Unpermitted parameter: witness

Все, кажется, как это предполагают, чтобы быть, что я здесь отсутствует?

EDIT:

удалось сохранить запись, добавив:

@complaint.witnesses.build

к create действия в контроллере, но он до сих пор не позволили мне сохранить :name там

<ActiveRecord::Relation [#<Witness id: 1, name: nil, phone: nil, complaint_id: 8, created_at: "2015-06-08 20:05:06", updated_at: "2015-06-08 

EDIT 2:

Удалось зафиксировать его, переместив @complaint.witnesses.build с create на действие new, и он исправил его, теперь я могу создать запись и позволить мне сохранять в ней текстовые поля.

+0

@chad_ что вы имеете в виду? –

+0

Работает ли 'fields_for @ company.witnesses' лучше? –

+0

@chad_ вы имеете в виду '@ complaints.witnesses', попробовал его, он отображает поле с уже введенным' Witness', попробовал его, и он дал мне тот же результат, не сохранил 'name:' ​​ –

ответ

0

Вы можете попробовать с изменив контроллер и просмотр кодов следующим образом

В контроллере

def new 
    @complaint = Complaint.new 
    @witnesses = @complaint.witnesses.build 
end 

def edit 
    @witnesses = @complaint.witnesses 
end 

В просмотров

<%= f.fields_for :witnesses, @witnesses do |witnesses_form| %> 
    <%= witnesses_form.text_field :name %> 
    <% end %> 
+0

'@complaint .witnesses.build' возвращает одну новую запись .-. –

+0

Удалось исправить это, добавив '@ complaints.witnesses.build' в действие' new' вместо 'create'. –

+0

@Johhan, если эта работа для вас, вы можете принять ответ, и это поможет людям найти решения. Благодаря :) –

0

я был в состоянии исправить это путем добавления @complaint.witnesses.build к new вместо действия create.

Так что мой контроллер теперь выглядит следующим образом:

def new 
    @complaint = Complaint.new 
    @complaint.witnesses.build 
    end 

    def create 
    @complaint = current_user.complaints.build(complaint_params) 
    if @complaint.save 

     redirect_to dashboard_complaint_path(@complaint) 
    else 
     render 'new' 
    end 
    end 

    private 

    def complaint_params 
    params.require(:complaint).permit(:complaint_info, witnesses_attributes: [:name]) 
    end 
Смежные вопросы