我正在使用JQuery Datatables gem,並且我已經成功地將它用於我的一個控制器。 SteamGames
。Rails Datatables,兩個控制器中的類似表
SteamGames控制器
def index
@steam_games = SteamGame.all
respond_to do |format|
format.html
format.json { render json: SteamGamesDatatable.new(view_context) }
end
end
數據表本身是非常簡單的,從我從git的了。
class SteamGamesDatatable
delegate :params, :link_to, :number_to_currency, to: :@view
def initialize(view)
@view = view
end
def as_json(options = {})
{
sEcho: params[:sEcho].to_i,
iTotalRecords: SteamGame.count,
iTotalDisplayRecords: games.total_entries,
aaData: data
}
end
private
def data
games.map do |game|
[
link_to(game.game_name, game),
"<img src='#{game.img_icon_url}'/>",
game.created_at.strftime("%B %e, %Y"),
game.updated_at.strftime("%B %e, %Y"),
]
end
end
def games
@games ||= fetch_games
end
def fetch_games
games = SteamGame.order("#{sort_column} #{sort_direction}")
games = games.page(page).per_page(per_page)
if params[:sSearch].present?
games = games.where("game_name like :search", search: "%#{params[:sSearch]}%")
end
games
end
def page
params[:iDisplayStart].to_i/per_page + 1
end
def per_page
params[:iDisplayLength].to_i > 0 ? params[:iDisplayLength].to_i : 10
end
def sort_column
columns = %w[game_name img_icon_url created_at]
columns[params[:iSortCol_0].to_i]
end
def sort_direction
params[:sSortDir_0] == "desc" ? "desc" : "asc"
end
end
現在,我將其設置爲另一個控制器Collections
,但我知道我是非常多餘的,但我不知道如何解決它。
「Collections」是用戶和SteamGames之間的中間件鏈接。
所以我想也許我可以只複製整個數據表的代碼,並與Collection.steam_game
取代SteamGame
我將在Rails的控制檯,但它告訴我
NoMethodError (undefined method 'steam_game' for #<Class:0x00000007159670>):
這樣做的目的是,如果我走到/collection/:id
我只會看到集合擁有的遊戲。 /steamgames
向我顯示數據庫中的每一場比賽。
如何在新控制器中輕鬆利用以前的邏輯?
如果我不能,那麼我該如何正確引用控制器中的關係鏈接?
FYI這是我試圖使託收出於好奇DataTable中
class CollectionsDatatable
delegate :params, :link_to, :number_to_currency, to: :@view
def initialize(view)
@view = view
end
def as_json(options = {})
{
sEcho: params[:sEcho].to_i,
iTotalRecords: Collection.count,
iTotalDisplayRecords: games.total_entries,
aaData: data
}
end
private
def data
games.map do |game|
[
link_to(game.game_name, game),
"<img src='#{game.img_icon_url}'/>",
game.created_at.strftime("%B %e, %Y"),
game.updated_at.strftime("%B %e, %Y"),
]
end
end
def games
@games ||= fetch_games
end
def fetch_games
games = Collection.steam_game.order("#{sort_column} #{sort_direction}") ##<--- This is where the error comes from
games = games.page(page).per_page(per_page)
if params[:sSearch].present?
games = games.where("game_name like :search", search: "%#{params[:sSearch]}%")
end
games
end
def page
params[:iDisplayStart].to_i/per_page + 1
end
def per_page
params[:iDisplayLength].to_i > 0 ? params[:iDisplayLength].to_i : 10
end
def sort_column
columns = %w[game_name img_icon_url created_at]
columns[params[:iSortCol_0].to_i]
end
def sort_direction
params[:sSortDir_0] == "desc" ? "desc" : "asc"
end
end
我想也許內SteamGamesController附加功能就足夠了,所以我可以在寫的def fetch_games
功能,但我不知道完全理解SteamGamesDatatable.new(view_context)
在控制器內調用什麼。我〜假設〜初始化(查看)功能?
集模型
class Collection < ApplicationRecord
belongs_to :user
belongs_to :steam_game
end
SteamGames其實很相似
架構的集合/ SteamGames
create_table "collections", force: :cascade do |t|
t.string "platform"
t.string "name"
t.bigint "user_id"
t.bigint "steam_game_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["steam_game_id"], name: "index_collections_on_steam_game_id"
t.index ["user_id"], name: "index_collections_on_user_id"
end
create_table "steam_games", force: :cascade do |t|
t.integer "appid", null: false
t.string "game_name", default: "", null: false
t.string "img_icon_url", default: "assets/32x32-no.png"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
更新2 - 傳遞額外的初始化
class CollectionsDatatable
delegate :params, :link_to, :number_to_currency, to: :@view
def initialize(view, steam_games_resource)
@view = view
@steam_games_resource = steam_games_resource
end
def as_json(options = {})
{
sEcho: params[:sEcho].to_i,
iTotalRecords: @steam_games_resource.count,
iTotalDisplayRecords: games.total_entries,
aaData: data
}
end
private
def data
games.map do |game|
[
link_to(game.game_name, game),
"<img src='#{game.img_icon_url}'/>",
game.created_at.strftime("%B %e, %Y"),
game.updated_at.strftime("%B %e, %Y"),
]
end
end
def games
@games ||= fetch_games
end
def fetch_games
games = @steam_games_resource.order("#{sort_column} #{sort_direction}")
games = games.page(page).per_page(per_page)
if params[:sSearch].present?
games = games.where("game_name like :search", search: "%#{params[:sSearch]}%")
end
games
end
def page
params[:iDisplayStart].to_i/per_page + 1
end
def per_page
params[:iDisplayLength].to_i > 0 ? params[:iDisplayLength].to_i : 10
end
def sort_column
columns = %w[game_name img_icon_url created_at]
columns[params[:iSortCol_0].to_i]
end
def sort_direction
params[:sSortDir_0] == "desc" ? "desc" : "asc"
end
end
控制器
def show
@collection = Collection.find(params[:id])
respond_to do |format|
format.html
format.json { render json: CollectionsDatatable.new(view_context, @collection.steam_game) }
end
end
我已經修改了初始化接受一個新的參數,我可能會變得複雜。我也通過數據表刪除了Collection.steam_game的實例。
目前我得到一個 undefined method
count'for#`響應,這讓我相信它正在試圖計數一個單獨的遊戲。我認爲這是因爲每個記錄都被插入到收集表中 - 所以即使它輸出'steam_game',也沒有計數。
得到這些後,我認爲我的模型可能沒有正確設置。
會員應該擁有「收藏」 - 收藏品有platform
和name
。該集合應該有遊戲。理論上這是正確的,但我注意到每個遊戲都在創建一個新的Collections行。
如果我不是有一個 用戶 收集 GameCollections 遊戲
系統,其中GameCollection不過是「聯盟」?和用戶有收藏?
最後更新
感謝@下面薯芋的答案,它幫助指導我的妥善解決。
我去了一個4步同步。 用戶 - >收藏< - >遊戲集合< - Steam_Games
這讓我找到誰擁有X steam_game
的所有用戶,並找到有X steam_game
固定邏輯畢竟收藏,我能使用與提供的建議相同的Datatable。
我CollectionsController
def show
@collection = Collection.find(params[:id])
respond_to do |format|
format.html
format.json { render json: SteamGamesDatatable.new(view_context, @collection.steam_games) }
end
end
現在,這顯示只適用於這個特定集合遊戲。我現在需要重新訪問命名約定,但這正是我所需要的。
(側面說明,它也創造了一個確切的重複CollectionsDatatable
工作但覺得很重複)
Interresting問題。你可以添加表格和模型的模式嗎? – Jeremie
向我們展示了'Collection.rb'模型 – Pavan