0

我需要使用这个 gem https://github.com/potatosalad/mongoid-data_table

这是我的模型代码:

class Admin
  include Mongoid::Document
  include Mongoid::Timestamps::Created
  include Mongoid::DataTable
  #datatableblock
  ## data_table ##
  data_table_options.merge!({
    :fields => %w(id email created_at role actions),
    :searchable => %w(email role),
    :dataset => lambda do |admin|
      {
        0 => "<%= check_box_tag \"admin_ids[]\", admin._id, false, :class => \"check\" %>",
        1 => admin.id,
        2 => "<%= link_to(admin.email, admin_admin_path(admin._id)) %>",
        3 => admin.created_at,
        4 => admin.role,
        5 => "<%= link_to(I18n.t('admin.actions.show'), admin_admin_path(admin._id)) %> - <%= link_to(I18n.t('admin.actions.edit'), edit_admin_admin_path(admin._id)) %> - <%= link_to I18n.t('admin.actions.delete'), admin_admin_path(admin._id)%>",
        :DT_RowId => admin._id
      }
    end
  })
end

我知道这个动作可能违反了模型-视图-控制器架构的某些原则。

我需要使用link_to和 ruby​​ on rails 代码在每列中生成正确的内容。

那么我的问题是:如何在不违反MVC原则的情况下以更好的方式做到这一点?

非常感谢

4

2 回答 2

0

如果它要破坏 MVC,也许最好的办法是将它放入 /lib 文件夹中的一个模块中,并将其作为包含而不是与其余代码内联加载。这也将有助于为您的模型承担一项责任。也许是这样的?

class Admin
  include Admin::CustomDatatable
end

module Admin
  module CustomDataTable
    data_table_options.merge!({
      :fields => %w(id email created_at role actions),
      :searchable => %w(email role),
       :dataset => lambda do |admin|
         {
           0 => "<%= check_box_tag \"admin_ids[]\", admin._id, false, :class => \"check\" %>",
           1 => admin.id,
           2 => "<%= link_to(admin.email, admin_admin_path(admin._id)) %>",
           3 => admin.created_at,
           4 => admin.role,
           5 => "<%= link_to(I18n.t('admin.actions.show'), admin_admin_path(admin._id)) %> - <%= link_to(I18n.t('admin.actions.edit'), edit_admin_admin_path(admin._id)) %> - <%= link_to I18n.t('admin.actions.delete'), admin_admin_path(admin._id)%>",
    :DT_RowId => admin._id
         }
      end
    })
  end
end
于 2012-11-15T23:16:01.777 回答
0

该 gem 是一个专门的用例,如果您不想向应用程序添加另一个类或层,它可能是合适的,但它确实违反了 MVC。

该 gem 尝试做的正确实现(imo)是Presenter Pattern

Rails 有很多 gem 实现了相同的功能。基本上,这段代码应该在自定义类中,而不是在模型文件中。

观看Ryan Bates 的这个 railscast以清楚地了解如何在没有任何宝石的情况下做到这一点,更重要的是在 MVC 中添加演示者。

当您将演示器、装饰器或其他设计模式与 MVC 结合使用时,它们不应该也不通常违反核心架构。

于 2012-11-19T09:29:19.840 回答