2

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

Моя модель Companyhas_one :incorporation. Включения есть, прямо сейчас в любом случае, одно поле, вложенная в Company формы следующим образом

<%= simple_form_for @company, url: url_for(action: @caction, controller: 'incorporations'), html: {id:"incorporationform"}, remote: false, update: { success: "response", failure: "error"} do |company| %> 
    ... 
    <%= company.simple_fields_for :incorporation do |f| %> 
     <div class="padded-fields"> 
      <div class="form_subsection"> 
       <%= f.input :trademark_search, as: :radio_buttons, label: 'Would you like us to do a trademark search and provide advice regarding any issues we identify in relation to the name you have selected?', input_html: { class: 'form-control radio radio-false' } %> 
      </div> 
     </div> 
    <% end %> 
    ... 
<% end %> 

The new и create методов в контроллере является

def new 
    @user=current_user 
    @company = @user.companies.build 
    @incorporation = @company.build_incorporation 
    @action = "new" 
    @caction = "create" 
    @remote=false 
end 

def create 
    @snapshot="incorporation" 
    @company = current_user.companies.build(company_params) 
    @incorporation = @company.build_incorporation 

    if @company.save 
     current_user.companies << @company 
     if params[:final_submit] 
      redirect_to incorporations_index_path 
     else 
      redirect_to edit_incorporation_path(@incorporation), notice: "Successfuly saved incorporation info." 
     end 
    else 
     render 'new', notice: "Something went wrong; form unable to be saved." 
    end 
end 

Проблема в том, что, когда я выберите один из переключателей в простых полях, журнал показывает, что данные отправляются на параметры:

Parameters: {"utf8"=>"✓",..., "company"=>{..."incorporation_attributes"=>{"trademark_search"=>"0"}},...} 

Но это НЕ Вставляется в таблицу. Вместо этого вводится новая запись, но только с company_id, id, created_at и updated_at, все из которых являются абсолютно точными. Не существует недопустимых ошибок параметров или чего-либо подобного.

Моего сильный PARAMS выглядеть следующим образом:

def company_params 
     params.require(:company).permit(:id, :name,...,incorporation_attributes: [:title, :trademark_search, :user_id, :employee_stock_options, :final_submit, :submit, :_destroy],...) 
end 

Так или иначе параметры не связывая со вставкой таблицы (если это имеет смысл). Что может быть здесь?

Спасибо за любые идеи.

ответ

2

Хорошо, есть некоторые недостающий код, но я думаю, что вопрос здесь:

@company = current_user.companies.build(company_params) 
@incorporation = @company.build_incorporation 

В первой строке создается модель компании вместе с инкорпорации модели (которая присутствует в company_params). Вторая строка, однако, переопределяет вашу модель регистрации с новой без каких-либо данных. Начиная с incorporation belongs_to company, исходный со всеми данными отбрасывается.

Решение: полностью удалить вторую линию, и все будет работать.

ДРУГИЕ ОШИБКИ:

Вам не нужна эта строка:

current_user.companies << @company 

@company уже строят на current_user.companies сферу, а это означает, что она уже принадлежит current_user. Это не вызовет видимых ошибок, это просто трата времени для сервера.

Вы также отсутствуют id внутри incorporation_attributes - это означает, что вы никогда не будете иметь возможность обновлять или удалять данные через гнездовых атрибуты (и у вас есть _destroy поле, поэтому я предполагаю, что вы хотели бы сделать это в какой-то момент).

+0

Эй спасибо за то, что смотреть на это. Вы были совершенно правы в линейке @incorporation. Я считаю, что мне нужна компания 'current_user.companies << @, потому что компания и пользователи связаны с моделью объединения. – neanderslob

+1

@neanderslob - Ах, да, в этом случае вам может понадобиться. :) – BroiSatse

1

Удалить эту линию

@incorporation = @company.build_incorporation 

от создания метода. Это снова создает запись (Incorporation). Вложенные формы будут создавать связанные записи, если родительский объект будет создан/обновлен. (Компания).

1

Вам только нужно «строить» связанный объект, если вы создаете новую запись (build записи пустая):

def create 
    @company = current_user.companies.new company_params 
    @company.save #-> incorporation already set in params 
+0

Спасибо, Rich, я на самом деле просто заметил, что я вставил старый код выше. Я позаботился изменить его после вчерашней тренировочной сессии :-) Я ЕСМЬ, однако, все еще немного туманно о различии между '.build' и' .new'. Я нажимаю пару других сообщений SO в надежде разобраться в этом. – neanderslob

+0

Есть разница - я прочитал его некоторое время назад, но упустил статью :( –

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