Проблема с использованием формы с вложенными маршрутами в рельсах 3 - PullRequest
1 голос
/ 29 марта 2011

У меня есть структура базы данных, в которой в моих статьях много людей (через объединение, но это работает нормально)

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

Т.е. путь должен иметь форму article / new / people / new

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

article.rb (модель)

attr_accessor :new_person

articles_controller.rb

  def create
    @article = Article.new(params[:article])

    if params[:add_person]
      @person = Person.check_if_exists_or_create(@article.new_person["first_name"], @article.new_person["last_name"])
      if @person.save
        @article.people << @person
        @article.new_person = nil
      end
      render :action => "new" and return
    end
...

  end

form.erb

<%= form_for @article  do |f| %>
...

      <%= fields_for :new_person do |p| %>

        <% if @person && @person.errors.any? %>
          <%= render :partial => "shared/error_messages", :object => @person %>
        <% end %>

        <div class="field">
          <%= p.label :first_name, "First Name" %>
          <%= p.text_field :first_name %>
        </div>

        <div class="field">
          <%= p.label :last_name, "Last Name" %>
          <%= p.text_field :last_name %>
        </div>

        <%= submit_tag "Add Person", :name => "add_person" %>

      <% end %>
...
  <p>
    <%= f.submit %>
  </p>


<% end %>

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

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

По этим причинам я подумал, что подход с вложенным маршрутом может быть более естественным.

Для существующих статей это работает нормально, например, / Articles / 1 / people / new без проблем.

Я знаю, что вложенные формы - это, кроме всего прочего, причины неточности проверки html, поэтому я попробовал многочисленные комбинации form_for и fields_for для достижения цели:

на статьи / новая страница

отправка основной формы в статьи / новые отправка формы "sub" с полями new_person в статьи / new / people / new

и сделать изменения в UJS настолько безболезненными, насколько это возможно

Самое теплое, как мне кажется, было с этой ошибкой

No route matches {:controller=>"people", :article_id=>#<Article id: nil, title: nil, published_on: nil, created_at: nil, updated_at: nil, people_count: nil, organizations_count: nil>}

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

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

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

Буду очень признателен за любые советы, включая альтернативные подходы, которые лучше соответствуют моим целям. Я смотрел трансляции, связанные с вложенными формами и вложенными маршрутами, и прочитал все, что я могу найти в Интернете, но не нашел решения проблемы / model / new / submodel / new form.

Большое спасибо.

...