我需要使用这个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
我知道这个动作可能违反了模型 - 视图 - 控制器架构的某些原则。
我需要在rails代码上使用link_to
和ruby来生成每列中的正确内容。
然后我的问题是:如何在不违反MVC原则的情况下以更好的方式做到这一点?
非常感谢
答案 0 :(得分:0)
如果要破坏MVC,最好的办法是将它放入/ lib文件夹中的模块并将其作为include加载,而不是与其余代码内联。这也有助于维护您的模型的一项责任。也许是这样的?
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
答案 1 :(得分:0)
该gem是一个专门的用例,如果你不想在你的应用程序中添加另一个类或层,它可能是合适的,但它确实违反了MVC。
gem正在尝试做的正确实现(imo)是Presenter Pattern。
Rails有许多实现相同的宝石。基本上,此代码应该在自定义类中,而不是在模型文件中。
观看Ryan Bates的this railscast,了解如何在没有任何宝石的情况下做到这一点,更重要的是在MVC中添加演示者。
当您使用演示者,装饰器或其他设计模式与MVC一起使用时,他们不应该也不会违反核心架构。