«Недопустимые параметры:» во вложенной форме Rails - PullRequest
0 голосов
/ 02 ноября 2018

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

в представлении Invitations у меня есть _form.html.erb:

<%= simple_form_for invitation, id: "invitation_form", :remote => true do |f| %>
    <div class="col-md-12">
      <%= f.error_notification %>
      <%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>
      <%= f.collection_select(:guest_id, User.all, :id, :full_name, {}, class: "selectpicker", title: "Choose recipient", multiple: true) %>
      <br>
      <br>
    </div>
    <br><br>
    <div class="col-md-12">
      <%= f.collection_select(:type_of_event, @type_evenement, :id, :type_name, {:include_blank => true}, class: "selectpicker", title: "Type", multiple: false) %>
      <br>
    </div>
    <div class="col-md-12">
      <br>
      <%= f.collection_select(:event_id, @events_list, :id, :title, {:include_blank => true}, class: "selectpicker", title: "Related event (Optional)", multiple: false) %>
      <br>
      <br>
      <%= f.input :title, placeholder: "Title", label: false %>
      <%= f.text_area :memo, placeholder: "Start writing", class: "form form-control", rows: 10 %>
      <div class="fields">
        <%= f.simple_fields_for :invsession do |builder| %>
          <%= render 'invitations/invsession_fields', f: builder %>
        <% end %>
      </div>
      <div class="form-actions">
        <br>
        <%= f.button :submit, class: "btn btn-primary" %>
      </div>
    </div>

  <% end %>

в том же виде приглашения, у меня есть частичное _invsession_fields.html.erb

<tr>
  <td>
    <%= f.input_field :_destroy, as: :hidden %>
    <%= link_to 'Delete', '#', class: 'remove_record' %>
  </td>
  <td>
    <div class='input-group date' id='datetimepicker2'>
      <%= f.text_field :start, :class => "form-control" %>
      <span class="input-group-addon">
              <span class="glyphicon glyphicon-calendar"></span>
          </span><br>
    </div>
  </td>
  <td>
    <div class='input-group date' id='datetimepicker3'>
      <%= f.text_field :end, :class => "form-control" %>
      <span class="input-group-addon">
              <span class="glyphicon glyphicon-calendar"></span>
          </span>
    </div>
  </td>
</tr>

по моему Invitation controller:

  def new
        @type_evenement = TypeEvenement.all
        @invitation = current_user.invitations.build(invitation_params)
        @invitation.invsessions.build
  end


   def invitation_params
      params.require(:invitation).permit(:user_id, :guest_id, :event_id, :start, :title, :type_of_event,:memo, :seen, :deleted, :modified, invsessions_attributes: Invsession.attribute_names.map(&:to_sym).push(:_destroy))
    end

Модель моего приглашения:

class Invitation < ApplicationRecord    
  belongs_to :user
  has_many :invsessions, dependent: :destroy
  accepts_nested_attributes_for :invsessions, allow_destroy: true      
end

и модель моего вторжения:

class Invsession < ApplicationRecord
  belongs_to :invitation, optional: true
  belongs_to :user
end

Дисплей работает хорошо, но когда я нажимаю сохранить, он сохраняет только новое приглашение, но не новый элемент вторжения. У меня есть следующее:

Processing by InvitationsController#create as JS
  Parameters: {"utf8"=>"✓", "invitation"=>{"guest_id"=>["", "1"], "type_of_event"=>"2", "event_id"=>"108", "title"=>"ssss", "memo"=>"ssss", "invsession"=>{"_destroy"=>"", "start"=>"2018-11-02 04:15 am +08:00", "end"=>"2018-11-02 04:15 am +08:00"}}, "commit"=>"Create Invitation", "locale"=>"en-us"}
  User Load (0.6ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?  [["id", 1], ["LIMIT", 1]]
Unpermitted parameters: :guest_id, :invsession
1
   (0.1ms)  begin transaction
  SQL (23.0ms)  INSERT INTO "invitations" ("user_id", "guest_id", "event_id", "title", "memo", "created_at", "updated_at", "type_of_event") VALUES (?, ?, ?, ?, ?, ?, ?, ?)  [["user_id", 1], ["guest_id", 1], ["event_id", 108], ["title", "ssss"], ["memo", "ssss"], ["created_at", "2018-11-02 08:15:37.916159"], ["updated_at", "2018-11-02 08:15:37.916159"], ["type_of_event", 2]]
   (25.6ms)  commit transaction
   (0.1ms)  begin transaction

с этой строчкой, которую я не знаю, как исправить Unpermitted parameters: :guest_id, :invsession

Что-то нужно изменить, чтобы это работало? Я следую учебному пособию по дрифтингу ruby ​​(070), которое кажется довольно простым.

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

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

у вас есть разные варианты, помните, что вы используете simple_form для создания входов, поэтому используйте помощник из simple_form для создания входов, и он автоматически создаст правильное имя

<%= f.input :start, input_html: { class: 'form-control' } %>

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

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

 <%= f.text_field :start, :class => "form-control", name: 'invitation[invsession_attributes][start]' %>

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

0 голосов
/ 02 ноября 2018

Ваш invitation_params должен выглядеть следующим образом. В соответствии с этим он будет принимать guest_id и invsessions_attributes как Array.

def invitation_params
  params.require(:invitation).permit(:user_id, guest_id:[], :type_of_event, :event_id, :title, :memo, :seen, :deleted, :modified, invsessions_attributes: %i[_destroy start end])
end

вы используете nested_attributes с отношением has_many, поэтому эти атрибуты также принимаются в виде массива.

# обновление 2

Можете ли вы попробовать это

def invitation_params
  params.require(:invitation).permit(:user_id, guest_id:[], :type_of_event, :event_id, :title, :memo, :seen, :deleted, :modified, :invsessions_attributes => [:_destroy, :start, :end])
end

# обновление 3

def invitation_params
 params.require(:invitation).permit(:user_id, :type_of_event, :event_id, :title, :memo, :seen, :deleted, :modified, guest_id:[], :invsessions_attributes => [:_destroy, :start, :end])
end 

положить guest_id:[] до invsessions_attributes работы.

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...