Rails 3: приватный предварительный просмотр изменений модели - PullRequest
0 голосов
/ 15 сентября 2011

У меня есть форма для модели, которая принимает вложенные атрибуты для нескольких других моделей:

class Page < ActiveRecord::Base

  belongs_to :user
  has_many :images
  has_many :videos
  has_many :options

  accepts_nested_attributes_for :images
  accepts_nested_attributes_for :videos
  accepts_nested_attributes_for :options

  def active?
    published # boolean field
  end

end

Мне бы хотелось, чтобы владелец страницы (пользователь) мог редактировать страницу и ее вложенные атрибуты, и немедленно видеть эти изменения без необходимости сохранять модель (что сделало бы ее общедоступной). Моя внутренняя реакция - клонировать страницу вместе со всеми ее ассоциациями (yikes!), Чтобы оригинал оставался нетронутым до тех пор, пока владелец не будет удовлетворен изменениями в клоне.

Есть ли более разумное или эффективное решение?

1 Ответ

0 голосов
/ 15 сентября 2011

РЕДАКТИРОВАТЬ - После просмотра has_draft, который является вариантом 2 - я бы на 100% согласился с этим.

У вас есть 3 варианта здесь:

Вариант 1 -

Вы можете сохранить данные в сеансе и соответственно извлечь их.

Вариант 2 -

Вы можете использовать черновой плагин / драгоценный камень, например "has_draft", который будет клонировать вашу модель.структурировать, создавать новую таблицу и т. д. и обрабатывать все это за вас.

https://github.com/rubiety/has_draft

Вариант 3 -

(не уверен, будет ли это работать точно, но я предпочитаю)

Вы можете продублировать свою страницудобавьте новое поле в модель вашей страницы под названием «duplicate_of» и, когда вы нажмете свое действие редактирования, создайте дубликат, передавая id исходной страницы.Затем в действии обновления проверьте, является ли он дубликатом, и если это так, перезапишите оригинал и удалите дубликат.

  def edit
    @original = User.find(params[:user_id]).pages.find(params[:id])
    @clone.duplicate_of = @original.id
    @clone.active = false
    @page = User.find(params[:user_id]).pages.create(@clone.attributes)
  end

  def update
      #you will need to add something here to check if its a duplicate
      #to begin with and if it is...

      @page = User.find(params[:user_id]).pages.find(params[:id])
      @original = User.find(params[:user_id]).pages.find(@page.duplicate_of)
      if @original.update_attributes(params[:page])
        @page.destroy
      end
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...