Rails: создайте пользовательский интерфейс для отдельного конкретного объекта - PullRequest
2 голосов
/ 01 июля 2011

Я столкнулся с проблемой, я совершенно не уверен, как к ней подойти.

У меня есть приложение для обмена архитектурными фотографиями.Пользователи have_many Фотографии и пользователи могут создавать Коллекции, которые также have_many Фотографии.

Теперь у меня есть один клиент, известный в отрасли, который хотел бы работать со мной над созданием полностью настроенной Коллекциис совершенно другим внешним видом и ощущением от «обычных» коллекций, но по существу с той же функциональностью под ним.Я хотел бы удовлетворить этот запрос, но я действительно не знаю, как это сделать.

Учитывая, что у меня уже есть действующая модель Collection и CollectionsController, плюс все виды, я быхотел бы использовать как можно больше из этого.Так, например, пользовательская коллекция должна переопределить пользовательское представление: представление, но не представление администратора: редактирование.

Как бы вы подошли к чему-то подобному?1016 * Я пытаюсь понять наиболее эффективный, СУХОЙ метод создания полностью пользовательского интерфейса для отдельной записи в базе данных.Я был бы очень признателен за предложения, включая ссылки на статьи / книги и т. Д., Так как я не смог найти много в этой области.

1 Ответ

1 голос
/ 01 июля 2011

Я бы разрешил создание Liquid шаблонов представления, связанных с пользователем и / или коллекцией (если вы хотите оба - шаблоны для каждого пользователя с вариациями для коллекции - используйте полиморфную ассоциацию) и, конечно,вернитесь к виду по умолчанию (также созданному с помощью Liquid для согласованности и справочности) для всех случаев, когда пользовательский шаблон не найден.

Изменить, чтобы добавить предлагаемые сведения:

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

# Table name custom_templates
# id               :integer
# templatable_type :string
# templatable_id   :integer
# contents         :text
class CustomTemplate < ActiveRecord::Base
  belongs_to :templatable, :polymorphic => true
end
class User
  has_one :custom_template, :as => :templatable    
end
class Collection
  has_one :custom_template, :as => :templatable
end

В вашем действии контроллера найдите пользовательский шаблон:

custom_template   = @collection.custom_template
custom_template ||= @user.custom_template
@custom_template = Liquid::Template.parse(custom_template.contents) if custom_template

С вашей точки зрения, вы можете сделать пользовательский шаблон или шаблон по умолчанию частичным:

<% if @custom_template -%>
  <%= @custom_template.render(_hash_of_objects_to_pass_to_liquid_template_) %>
<% else -%>
  <%= render :partial => 'default' %>
<% end -%>
...