Пользовательский ответчик для данных jqGrid в рельсах - PullRequest
3 голосов
/ 31 января 2012

Я думал, что это будет легко.Определите модуль респондента 'to_grid', включите его для использования в соответствующих местах, дайте jqgrid использовать URL-адреса, например '/client.grid' для взаимодействия, и получите возможность поделиться действием покоя с респондентом html.Я просмотрел несколько драгоценных камней jqGrid, но не увидел ни одной, которая была бы в центре внимания недавно добавленного кода, совместимого с rails 3.1, камня не подключаемого модуля и полного доступа к 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 разных контроллерах.

Вопрос : стоит ли эта стратегияпреследование или есть более простой или более идиоматичный, чтобы попробовать.

Бонусный вопрос : указатель на рабочий код отдыха / ответчика, который я мог бы прочитать и использовать в качестве модели.

Спасибо!

1 Ответ

0 голосов
/ 03 марта 2012

Здесь много потенциальных проблем:

Я думаю, это означает, что ваше условие возвращает false, а render не вызывается, поэтому он ищет шаблон представления для визуализации по умолчанию.Вы проверяли, чтобы убедиться, что resource.is_a? (ActiveRecord :: Relation) возвращает true для вашего варианта использования?Унаследованные ресурсы не возвращают ActiveRecord :: Relation для ресурса - он должен возвращать экземпляр ActiveRecord :: Base.

Кроме того, есть ли lib в вашем пути автозагрузки, если вам не нужно

require Rails.root.join("lib/application_responder")

Также, вы можете подтвердить, что вызывается метод to_grid?

Я рекомендую использовать pry: https://github.com/pry/pry, чтобы проанализировать, что здесь происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...