2015-07-31 2 views
0

Этот код успешно создает новое уведомление, как задумано:Rails правильный способ представить вложенные параметры в виде

В форме представить:

<%= form_tag({controller: "notices", action: "create"}, method: "post", class: "comment_form", html: { multipart: true }) do %> 
    . 
    <%= hidden_field_tag "notice[supernotice][commentee_id]", notice.id %> 
    . 
<% end %> 

В notices_controller.rb:

def create 
    @character = Character.find_by(callsign: params[:callsign]) 
    @notice = @character.notices.build(notice_params) 
    if @notice.save 
    if !params[:notice][:supernotice][:commentee_id].nil? 
     @notice.create_comment(params[:notice][:supernotice][:commentee_id]) # hits the create_comment method in notice.rb 
    end 
    end 

def notice_params 
    params.require(:notice).permit(:content, :picture, :latitude, :longitude, supernotice_attributes: [:commentee_id]) 
end 

Класс notice.rb:

has_one :supernotice, through: :active_comment_relationship, source: :commentee 
accepts_nested_attributes_for :supernotice 

def create_comment(other_notice_id) 
    create_active_comment_relationship(commentee_id: other_notice_id) 
end 

Однако в журналах отображается ошибка: Unpermitted parameter: supernotice. Как я могу избавиться от этой ошибки? Что не так с тем, как я подаю вложенный параметр?

+0

Попробуйте изменить разрешение от 'supernotice_attributes' до' supernotices_attributes'. Кроме того, вы должны получить доступ к 'notice_params' в своем контроллере и не использовать' params' напрямую. –

+0

Использование 'supernotices_attributes' не имеет никакого отношения к сожалению. – Bazley

ответ

2

Вы можете попробовать это:

<%= hidden_field_tag "notice[supernotice_attributes][0][commentee_id]", notice.id %> 

Но в целом, как вы создаете свои вложенные атрибуты не так. Вы должны начать с form_for helper, а затем для вложенных атрибутов используйте f.fields_for helper. Например:

<%= form_for @notice do |f| %> 

    <%= f.fields_for :supernotice do |ff| %> 
    <%= ff.hidden_field :commentee_id, @notice.id %> 
    <% end %> 

<% end %> 

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

+0

Что не так с использованием 'form_tag' вместо' form_for'? Почему 'form_tag' существует, если это неправильно? – Bazley

+0

@Bazley, form_tag работать сложнее. Я думаю, что form_tag более подходит для конкретных пользовательских случаев. Но когда вы работаете с моделями и особенно с вложенными атрибутами, проще использовать form_for и fields_for. Ваш пример - хороший пример. Если вы переписываете код с полями, то вам вообще не нужно это скрытое поле. –

+0

Что меня останавливает, так это то, что вам нужна переменная экземпляра для form_for. Я не хочу использовать переменную экземпляра. Может ли form_ использоваться без переменной экземпляра? – Bazley

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