Использование form_with с ссылочным ресурсом в Rails 5 - PullRequest
0 голосов
/ 04 мая 2019

У меня есть ресурс с собственной ссылкой, Node, настроенный так:

class Node < ApplicationRecord
  belongs_to :parent, class_name: 'Node', foreign_key: 'node_id', optional: true
  has_many :children, class_name: 'Node', foreign_key: 'node_id'
end

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

Например, если я открою /nodes/1, там должна быть форма, и каждый узел, который я создаю из этой формы, должен автоматически заполнить node_id идентификатором текущего узла 1.

Как мне настроить form_with и nodes_controller, чтобы это позволило мне достичь этого?

Самое близкое, что я получил, было создание специального метода (с соответствующим маршрутом):

def create_child
  @node = Node.new(node_params)
  @node.node_id = params[:id]

  if @node.save
    redirect_to node_path(params[:id])
  end
end

private
  def node_params
    params.require(:node).permit(:name)
  end

А затем настройте форму следующим образом:

<%= form_with url: "create_child" do |form| %>
  <%= form.text_field :name %>
  <%= form.submit %>
<% end %>

Запрос проходит, но затем я получаю эту ошибку:

ActionController::ParameterMissing (param is missing or the value is empty: node)

Но, насколько я могу судить, объект Node должен был быть создан в методе create_child.

Есть идеи?

1 Ответ

0 голосов
/ 04 мая 2019

Я вроде как решил.

Форма:

<%= form_with model: @node.children.build do |form| %>
  <%= form.text_field :name %>
  <%= form.hidden_field :node_id %>
  <%= form.submit %>
<% end %>

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

def create
  @node = Node.new(node_params)

  if @node.save
    redirect_to @node.parent
  end
end

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

...