Rails, отправляющий массив с fields_for - PullRequest
0 голосов
/ 01 июня 2018

Как вы получаете fields_for для отправки массива?Все, что я нашел в SO, не работает для меня.

Мои параметры отправляются следующим образом:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"mxHD...VoA==", "callsign"=>"baz", "post"=>{"conversation_attributes"=>{"missives_attributes"=>{"content"=>"Hello"}}}}

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

Parameters: {"utf8"=>"✓", "authenticity_token"=>"mxHD...VoA==", "callsign"=>"baz", "post"=>{"conversation"=>{"missives"=>[{"content"=>"Hello"}]}}}

Я просто хочу отправить один экземпляр missive, но в виде массива.Другими словами, массив с одним членом.

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

FAIL 1

_post_form.html.erb

<%= f.fields_for :conversation do |ff| %>
  <%= ff.fields_for 'missives[]', [] do |fff| %>
    <%= fff.text_area :content %>
    ...
  <% end %>
<% end %>

Результат: Ошибка: неопределенный идентификатор метода для []: Array

FAIL 2

Это отношение ActiveRecord, поэтому, очевидно, мне не нужны методы получения / установки.

<%= f.fields_for :conversation do |ff| %>
  <% @missives = [] %>
  <%= ff.fields_for :missives, @missives do |fff| %>
    <%= fff.text_area :content %>
    ...
  <% end %>
<% end %>

Результат: ошибка (неопределенный метод `content 'для []: Array)

FAIL 3

<%= f.fields_for :conversation do |ff| %>
  <%= ff.fields_for :missives, @missives do |fff| %>
    <%= fff.text_area :content %>
    ...
  <% end %>
<% end %>

Результат: делаетне ставить квадратные скобки вокруг ракет.

FAIL 4

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

@missives = [Postmissive.new]

В форме сообщения:

<%= f.fields_for :conversation do |ff| %>
  <%= ff.fields_for :missives, @missives do |fff| %>
    <%= fff.text_area :content %>
    ...
  <% end %>
<% end %>

Результат: Ошибка (неопределенный метод `content 'для массива).

Текущее состояние кода:

post.rb

has_one :conversation, class_name: 'Postconversation', dependent: :destroy
accepts_nested_attributes_for :conversation

postconversation.rb

has_many :missives, class_name: 'Postmissive', dependent: :destroy
accepts_nested_attributes_for :missives

postmissive.rb

belongs_to :conversation, class_name: 'Postconversation', foreign_key: 'conversation_id'
validates :content, presence: true

posts_controller.rb

@post = @character.posts.create(post_params)
...

def post_params
  params.require(:post).permit( conversation_attributes: [ missives_attributes: [ :content ] ] )
end

_post_form.html.erb

<%= f.fields_for :conversation do |ff| %>
  <%= ff.fields_for :missives do |fff| %>
    <%= fff.text_area :content %>
    ...
  <% end %>
<% end %>

1 Ответ

0 голосов
/ 01 июня 2018

Ответ не нацелен на успех / неудачу формы или на то, что происходит после отправки формы.

Он просто нацелен на отправку missives в виде массива.

  <%= f.fields_for :conversation, Postconversation.new do |ff| %>
    <%= ff.label :message %>
    <%= ff.text_field :message %>

    <%= ff.fields_for 'missives_attributes[]', Postmissive.new do |fff| %>
      <%= fff.label :content, [] %>
      <%= fff.text_field :content %>
      <%= fff.text_field :content %>
      <%= fff.text_field :content %>
    <% end %>
  <% end %>

Пожалуйстаобратите внимание, что Postconversation.new и Postmissive.new просто добавлены, чтобы код работал.Вы ДОЛЖНЫ изменить его в соответствии с логикой вашего приложения.

Вывод параметров:

{"utf8"=>"✓",
 "authenticity_token"=>"auth_token",
 "post"=>
  {"title"=>"Lorem Ipsum",
   "conversation_attributes"=>
    {"message"=>"Lorem ipsum",
     "missives_attributes"=>
      [{"content"=>"Dolore labore et eos ut quod"},
       {"content"=>"Lorem ipsum"},
       {"content"=>"Lorem ipsum"}]}},
 "commit"=>"Create Post"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...