Rails 5.2: как создать дублирующую запись для себя - PullRequest
0 голосов
/ 24 февраля 2020

В моем приложении настроены отношения со ссылками на себя, так что AppForm может belong_to другой AppForm - Variations.

Поведение, которое я пытаюсь создать, - это кнопка на странице AppForm show, по которой можно щелкнуть, чтобы создать новый вариант AppForm. Эта кнопка в идеале создаст дубликат текущей записи и перенаправит пользователя на страницу edit этой новой записи, чтобы внести изменения перед ее сохранением.

У меня таблица variations настроена таким образом, как в моем schema.rb:

  create_table "variations", force: :cascade do |t|
    t.bigint "app_form_id"
    t.bigint "original_app_form_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.bigint "user_id"
    t.index ["app_form_id", "original_app_form_id"], name: "index_variations_on_app_form_id_and_original_app_form_id", unique: true
    t.index ["app_form_id"], name: "index_variations_on_app_form_id"
    t.index ["original_app_form_id"], name: "index_variations_on_original_app_form_id"
    t.index ["user_id"], name: "index_variations_on_user_id"
  end

С этим, как моя variation.rb модель:

class Variation < ApplicationRecord
  belongs_to :user
  belongs_to :app_form
  belongs_to :original_app_form, class_name: "AppForm"
end

И это в моей app_form.rb модели:

class AppForm < ApplicationRecord
  belongs_to :application_status, optional: true
  belongs_to :final_decision, optional: true
  belongs_to :funding_status, optional: true
  belongs_to :user, optional: true
  belongs_to :app_form, through: :variations
end

Это кажется довольно стандартно для has_many :through отношений, но теперь я не могу показаться Google своим способом создания дублированного варианта AppForm. Я видел такие посты, как , этот , которые показывают различные способы сделать это. Некоторые используют маршруты, другим нужны специальные драгоценные камни ... Я заблудился. Что такое Rails-y, чтобы сделать это правильно?

1 Ответ

0 голосов
/ 25 февраля 2020

Не существует "Rails-y" пути к этому. Соглашения Rails на самом деле не охватывают все возможные варианты использования, которые вы можете найти для фреймворка. Если вы не можете найти способ «Rails-y», очень велика вероятность того, что он не существует.

Но это то, что относительно просто построить с вложенным маршрутом и вложенными ресурсами.

# config/routes.rb
resources :app_forms do
  resources :variations, only: [:new, :create]
end

class AppForm < ApplicationRecord
  # ...
  def reproducable_attributes
    attributes.except('id', 'created_at', 'updated_at')
  end
end

class Variation < ApplicationRecord
  accepts_nested_attributes_for :app_form

  # ...
  # factory method to create a new instance from an existing AppForm
  def self.of(original_app_form)
    new(
      original_app_form: original_app_form,
      app_form_attributes: original_app_form.reproducable_attributes
    )
  end
end
class VariationsController < ApplicationController
  before_action :set_original_app_form

  # GET /app_forms/:app_form_id/variations/new
  def new
    @variation = Variation.of(@original_app_form)
  end

  # POST /app_forms/:app_form_id/variations
  def create
    @variation = @original_app_form.variations.new(variation_params) do |v|
      v.user = current_user
    end
    if @variation.save 
      redirect_to @variation.app_form
    else
      render :new
    end
  end

  private

  def set_original_app_form
    @original_app_form = AppForm.find(params[:app_form_id])
  end

  def variation_params
    params.require(:variation)
          .permit(app_form_attributes: [:foo, :bar])
  end
end
<%= form_for([@original_app_form, @variation]) do |f| %> 
  <%= f.fields_for :app_form do |app_form_fields|%>
    # ...
  <% end %>
  # ...
<% end %> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...