0

このgemhttps://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

このアクションは、Model-View-Controllerアーキテクチャのいくつかの原則に違反している可能性があることを私は知っています。

link_to各列内に正しいコンテンツを生成するには、RubyonRailsコードを使用する必要があります。

次に、私の質問は、MVCの原則に違反することなく、より良い方法でそれを行うにはどうすればよいですか?

どうもありがとうございます

4

2 に答える 2

0

MVCを壊そうとしている場合、おそらく最良の方法は、MVCを/ libフォルダー内のモジュールに配置し、残りのコードとインラインではなく、インクルードとしてロードすることです。これは、モデルに対する1つの責任を維持するのにも役立ちます。おそらくこのようなものですか?

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)は、プレゼンターパターンです。

同じことを実装するRails用の多くの宝石があります。基本的に、このコードはモデルファイルではなく、カスタムクラスに含める必要があります。

Ryan Batesによるこのレールキャストを見て、宝石なしでこれを行う方法、さらに重要なことにMVCにプレゼンターを追加する方法を明確に把握してください。

プレゼンター、デコレーター、またはその他のデザインパターンをMVCと組み合わせて使用​​する場合、それらはコアアーキテクチャに違反してはならず、通常は違反しません。

于 2012-11-19T09:29:19.840 に答える