更好的方法在rails 3上使用link_to

时间:2012-11-15 21:50:14

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1

我需要使用这个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原则的情况下以更好的方式做到这一点?

非常感谢

2 个答案:

答案 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一起使用时,他们不应该也不会违反核心架构。