2012-11-15 48 views
0

我需要使用這個gem https://github.com/potatosalad/mongoid-data_table在rails上使用link_to的更好方法3

這是我的模型代碼:

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的原則是什麼?

非常感謝您

+0

這是使用該寶石的方式。另一種方法是不使用mongoid-data_table。 –

+0

同意上面的評論:MVC是一種構建代碼的方法,可以解決許多常見問題。並非全部。 –

回答

0

創業板是一個專門使用情況和可能適合,如果你不希望其他類或圖層添加到您的應用程序,但它確實違反MVC。

的是什麼寶石試圖做正確執行(IMO)是Presenter Pattern

有爲其實現相同的Rails許多寶石。基本上,這個代碼應該在一個自定義類中,而不是在模型文件中。

觀看Ryan Bates的this railscast可以清楚地瞭解如何在沒有任何寶石的情況下做到這一點,更重要的是增加了MVC中的演示者。

當您使用主持人,裝飾或其他設計模式與MVC串聯,他們不應該與通常不違反核心架構。

+0

非常感謝!但瑞恩貝茨的方式是積極記錄。我需要一種方式與mongoid。謝謝 – hyperrjas

+0

@hyperrjas ORM不會改變解決方案的實現方式......他定義的** fetch_products **方法只需要使用Mongoid ORM /查詢語法,它將完美工作! –

+0

@hyperrjas關鍵帶走的是如何創建一個自定義演示類,用它來提取記錄,返回半格式化數據作爲JSON和委託某些方法的觀點....像__link_to__ –

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 
+0

謝謝。這個想法很好,但對於這個寶石來說工作不好。當我嘗試運行rails服務器時出現錯誤。 'data_table_options'方法不在模型外部工作。 – hyperrjas