我遇到了一个问题,我完全不确定如何解决。
我有一个分享建筑照片的应用程序。用户have_many
照片,用户可以创建集合,也可以创建have_many
照片。
现在,我有一位业内知名客户,他希望与我合作,创建一个完全定制的系列,其外观和感觉与"常规"系列截然不同,但基本上具有相同的功能。我想接受这个请求,但我真的不知道该怎么做
考虑到我已经有了一个正常工作的Collection
模型和CollectionsController
,再加上所有的视图,我希望尽可能多地重用它们。因此,例如,自定义Collection需要覆盖面向用户的:show视图,但不覆盖admin:edit视图。
你会如何处理这样的事情?
我正在努力理解为数据库中的单个记录创建完全自定义UI的最有效的DRY方法。我非常感谢你的建议,包括文章/书籍的链接等,因为我在这方面找不到太多。
我将允许创建与用户和/或集合关联的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 -%>