Rails Complex Form: выбор и работа с шаблонами - PullRequest
0 голосов
/ 01 февраля 2012
class Project < ActiveRecord::Base 
  has_one :template 
end 

class Template < ActiveRecord::Base 
  belongs_to :project, foreign_key: "project_id" 
  belongs_to :admin
end 

class Admin < ActiveRecord::Base 
  has_many :templates
end 

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

Затем я хочу отредактировать шаблон @project & @ project.template без изменения шаблона администратора.

====== ВЫПУСК ========

Мне не удалось найти ресурс, который показывает, как:

  • Собрать коллекцию Template.all
  • Передать атрибуты выбранного шаблона (кроме: id) в@ project.build_template
  • Создать новый экземпляр шаблона (включая ассоциации и атрибуты), связанный с новым проектом

Ответы [ 2 ]

1 голос
/ 06 февраля 2012

Вот один из способов сделать это. Сначала вам нужно создать новый шаблон в Project new action.

template.build

Затем добавьте collection_select. Примерно так:

<%= f.collection_select(:random_virtual_attribute, Templates.all, :id, :name, {:include_blank => true}, {:multiple => false} ) %>

Затем прикрепите к событию изменения на выбор. Когда это изменится, сделайте запрос JSON, чтобы получить этот конкретный шаблон. Вы можете использовать response_to и response_with, http://davidwparker.com/2010/03/09/api-in-rails-respond-to-and-respond-with/.. В обратном вызове JSON-запроса установите все fields_for созданного вами шаблона.

0 голосов
/ 08 февраля 2012

Достигнутое мной решение:

(1) Область применения шаблонов, созданных администратором.Не показывать дубликаты.

app / models / template.rb

scope :unique_title, where(admin: true).order(:title).select("DISTINCT title").select(:id)

(2) Соберите шаблоны в форме

project / create.html.haml

= simple_form_for @project do |f|
  = simple_fields_for :template do |template_form|
    = template_form.input :id, collection: admin.templates.unique_title

(3) Создайте новый проект и затем вызовите метод в Project для создания нового шаблона на основе атрибутов @ template

app / controllers / projects_controller.rb

def create
  @project = Project.new(params[:project[)
  @template = Template.find(params[:template][:id])
  if @project.save
    @project.create_new_template(@template)
  ....normal stuff here....
end

(4) Создайте новый объект шаблона в Project

  def create_new_template(template)
    self.build_template do |t|
      t.title = template.title
      ...other template attributes here....
      t.save!
    end
  end

Это работает, но я хочу принять душ ... контроллер слишком запутан.Я хотел бы создать новый шаблон after_create в Project, однако я не уверен, как получить доступ к параметрам шаблона.Выложу решение, если смогу рефакторинг.Если у кого-то есть предложения / критика, они очень принимаются

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...