2015-10-31 4 views
2

Я использую драгоценный камень кокона, чтобы попытаться добавить объект, принадлежащий другому, с вложенными полями. У меня есть «user_resolution», у которого много «этапов». Я установил ассоциации соответственно в обеих этих моделях. По какой-то причине вехи не создаются, однако, если я добавлю их вручную в базу данных, я могу ее успешно обновить. Я могу динамически добавлять поля и удалять их, используя драгоценный камень кокона, но это все. Когда я нажимаю «добавить веху», он перенаправляет меня на представление представления пользовательского разрешения и выдает сообщение об успешном обновлении разрешения пользователя, никаких ошибок не выдается, но вехи (ы) не создаются.Вложенные поля не добавляются в форму submit

user_resolution.rb

has_many :milestones 
accepts_nested_attributes_for :milestones, reject_if: :all_blank, allow_destroy: true 

milestone.rb

belongs_to :user_resolution 

Я настроил вложенную форму в режиме редактирования, как теперь я только хочу, чтобы пользователи добавить веху к разрешению в виде редактирования.

user_resolutions/edit.html.erb

<%= form_for(@user_resolution) do |f| %> 

    <div class="field"> 
    <%= f.label :name %><br> 
    <%= f.text_field :name %> 
    </div> 
    <div class="field"> 
    <%= f.label :description %><br> 
    <%= f.text_area :description %> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 

    <%= f.fields_for :milestones do |milestone| %> 
     <%= render 'milestone_fields', f: milestone %> 
    <% end %> 

    <%= link_to_add_association 'Add Milestone', f, :milestones %> 
    <%= f.submit "Add Milestone" %> 

<% end %> 

_milestone_fields.html.erb

<div class="nested-fields"> 
    <div class="field-row"> 
     <%= f.label :name, 'Name' %> 
     <%= f.text_field :name %> 
    </div> 
    <div class="field-row"> 
     <%= f.label :description, 'Name' %> 
     <%= f.text_area :description %> 
    </div> 
    <div class="field-row"> 
     <%= f.label :severity, 'severity' %> 
     <%= f.check_box :severity %> 
    </div> 
    <div class="field-row"> 
     <%= f.label :target_date, 'target_date' %> 
     <%= f.date_select :target_date %> 
    </div> 

    <%= link_to_remove_association 'Remove', f %> 

</div> 

разрешенных параметров в пределах контроллера Разрешения пользователя также содержать следующие

milestones_attributes: [:id, :user_resolution_id, :name, :description, :target_date, :severity, :complete, :_destroy] 

Вехи сами не имеют взглядов, у них есть только модель и контроллер. Контроллер создать действие (который я не уверен требуется для вложенных форм) содержит стандартный следующий код

def create 
    @milestone = Milestone.new(milestone_params) 

    if @milestone.save 
     redirect_to user_resolutions_path, 
     :flash => { :success => "You successfully created a milestone" } 
    else 
     redirect_to new_milestone_path, 
     :flash => { :error => "Oops something went wrong. Try again." } 
    end 
end 

Я был столь информативна, как я могу, но если вам нужно что-нибудь еще, дайте мне знать. Спасибо, парни.

+0

У вас есть два подарка в вашей форме. используйте только последний и удалите другой. Также опубликуйте журнал регистрации, чтобы показать полные параметры. –

+0

Вы можете публиковать параметры, которые вы получаете от запроса на отправку? –

ответ

1

, который я не уверен требуется для вложенных форм

Вам не нужен create действия для milestones - они будут заполняться от действия user_resolutions#create контроллера.

Есть несколько вещей, чтобы посмотреть с этим. Я подробно расскажу здесь. Это не будет конкретным ответом, но может помочь вам в правильном направлении.


Во-первых, вам нужно убедиться, что вы получаете правильные Params.

Cocoon отлично справляется с созданием вложенной формы - вам нужно убедиться, что это связано с структурой вложенных атрибутов Rails.

Для этого вам необходимо right-click > view source.

В разделе f.fields_for (не будем называть, что в HTML), вы будете искать эквивалент следующего:

<input type="text" name="milestones_attributes[0][name]" value=""> 

Важно отметить это имя ...

Каждый раз, когда вы используете форму или любого Rails просмотр помощника по этому вопросу, вы действительно просто строит стандартный HTML. form_for просто создает HTML-форму, поэтому любые содержащиеся в ней параметры должны придерживаться определенной структуры для Rails для распознавания параметров.

Элементы f.fields_for обычно называются x_attributes[:id][:param] - это передается в Rails, который циклически проходит через каждый [:id], чтобы определить количество вложенных параметров для добавления.

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


Во-вторых, вы должны убедиться, что ваши объекты в настоящее время построены в контроллере.

Я не знаю, как Cocoon делает это, но, по сути, каждый раз, когда вы используете f.fields_for, вы должны создать соответствующий объект до:

def new 
    @user_reservation = UserReservation.new 
    @user_reservation.milestones.build #-> this is what makes f.fields_for work 
end 

Если первый шаг показывает неправильный элемент именования, это означает, ваши ассоциативные объекты не строятся (вот почему они не распознаются).

Чтобы проверить это, вы должны создать ассоциативные объекты в методе перед отправкой.


Наконец, вы хотите опубликовать Params.

Они расскажут вам в деталях, что делает Rails с вложенными атрибутами, позволяя вам определить, что с ними происходит.

Извините за длинный ответ. В любом случае вы не получите никаких ответов, поэтому я счел разумным дать вам кое-что.

+0

Спасибо, Rich, извините за задержку. Я создал связанный объект в новом действии. Что касается HTML-кода на полях, я сделал бы быстрый взгляд, и я помню, как он использовал эту структуру. Как только я вернусь домой, я проверю все правильно, у меня не было возможности на пару дней. Спасибо за ответ, я дам вам знать, как я нахожусь. –

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