【问题标题】:Rails: Create a custom UI for a single specific objectRails:为单个特定对象创建自定义 UI
【发布时间】:2011-06-30 21:10:40
【问题描述】:

我遇到了一个完全不确定如何解决的问题。

我有一个用于分享建筑照片的应用。用户have_manyPhotos,用户可以创建收藏集have_manyPhotos。

现在我有一位业内知名的客户,他想与我合作创建一个完全定制的系列,该系列的外观和感觉与“常规”系列截然不同,但功能基本相同。我想满足这个要求,但我真的不知道该怎么做。

鉴于我已经有一个正常工作的Collection 模型和CollectionsController,以及所有视图,我想尽可能多地重复使用这些模型。因此,例如,自定义 Collection 需要覆盖面向用户的 :show 视图,但不是 admin :edit 视图。

你会如何处理这样的事情?

我正在尝试了解为数据库中的单个记录创建完全自定义 UI 的最有效的 DRY 方法。我非常感谢您的建议,包括文章/书籍的链接等,因为我在这方面找不到太多东西。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 user-interface views


    【解决方案1】:

    我将允许创建与用户和/或集合关联的 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 -%>
    

    【讨论】:

    • 最终用户如何使用 Liquid?我是否将他们的模板存储在数据库中或其他什么...控制器如何知道要使用哪个模板?我以前从来没有做过这样的事情,所以我真的很迷茫。
    • 是的,自定义模板将存储在数据库中,而默认视图仍存储在文件系统中。
    • 我会尽量在第二天左右提供更多细节 - 我现在要出去一段时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    相关资源
    最近更新 更多