我觉得这很容易。定义一个'to_grid'响应器模块,包含它以便在适当的位置使用,让jqgrid使用像'/client.grid'这样的网址进行交互,并且能够与html响应器共享休息动作。我查看了一些jqGrid宝石的选择,但没有看到任何在最近添加的代码,rails 3.1 compatable,gem不是插件以及完整REST访问的最佳位置。
但显然我不太了解响应者,或者它是一种完全不合适的策略选择。
jqGrid是一个基于JQuery的数据网格,它使用JSON与服务器通信。我的策略是这样的......
#Gemfile
gem 'kaminari'
gem 'responder'
gem 'inherited_resources'
#config/initializers/mime_types.rb
Mime::Type.register "application/json", :grid
#lib/application_responder.rb
require 'grid_responder'
class ApplicationResponder < ActionController::Responder
include Responders::GridResponder
end
#lib/grid_responder.rb
module Responders
module GridResponder
extend ActiveSupport::Concern
module InstanceMethods
def to_grid
#Only pagination included at this time.
if get? && resource.is_a?(ActiveRecord::Relation)
total = resource.klass.count
page, rows = controller.params[:page], controller.params[:rows]
paginated = resource.page(page).per(rows)
output = { total: (total / rows) + 1,
page: page,
records: total,
rows: resource }
render json: output.to_json
end
end
end
end
end
#app/controllers/application_controller.rb
require "application_responder"
class ApplicationController < ActionController::Base
self.responder = ApplicationResponder
respond_to :html, :json, :grid
end
#app/controllers/client_controller.rb
class ClientController < InheritedResources::Base
end
但是调用/client.grid正在补偿没有找到模板。我真的没想到需要一个模板。我开始怀疑这种策略是否值得追求。我有大约十几个我需要网格的模型,在12个不同的控制器中做同样的事情似乎不太干。
问题:这个策略是值得追求的还是更容易或更惯用的尝试。
奖金问题:指向我可以阅读并用作模型的工作休息/响应代码的指针。
谢谢!
答案 0 :(得分:0)
这里有许多潜在的问题:
我认为这意味着你的条件是返回false并且渲染没有被调用,所以它正在寻找一个默认渲染的视图模板。您是否检查过以确保resource.is_a?(ActiveRecord :: Relation)为您的用例返回true? Inherited Resources不为资源返回ActiveRecord :: Relation - 它应该返回一个ActiveRecord :: Base实例。
此外,如果您不需要
,则自动加载路径中是否为librequire Rails.root.join("lib/application_responder")
另外,你能否确认调用了to_grid方法?
我建议使用pry:https://github.com/pry/pry来反思这里发生的事情。