Commit fc40c834 by ivan Lan

Add Shotengai::Controller::Base & Add some controller

parent a8975486
require "shotengai/version"
require 'rails'
# require 'active_record'
require 'active_record'
module Shotengai
# Your code goes here...
autoload :Product, 'shotengai/product'
autoload :Series, 'shotengai/series'
autoload :Snapshot, 'shotengai/snapshot'
......@@ -16,6 +15,17 @@ module Shotengai
autoload :Engine, 'shotengai/engine'
module Controller
autoload :Base, 'shotengai/controllers/base'
module Merchant
autoload :ProductsController, 'shotengai/controllers/merchant/products_controller'
autoload :ProductSnapshotsController, 'shotengai/controllers/merchant/product_snapshots_controller'
autoload :ProductSeriesController, 'shotengai/controllers/merchant/product_series_controller'
autoload :OrdersController, 'shotengai/controllers/merchant/orders_controller'
end
module Customer
end
end
end
module Shotengai
class Controller < ApplicationController
# The resources of this controller
# ActiveRecord::Relation or ActiveRecord::Base
cattr_accessor :resources
# The view template dir
# respond_with @products, template: "#{self.class.template_dir}/index"
cattr_accessor :template_dir
class << self
# Add the index query to custom the @@index_resouces on the base of @@resources
# Foe example:
#
# index_query do |klass|
# klass.where(product: params[:product_id]).order('desc')
# end
#
def index_query &block
# 为了保证 self 为Controller instance variable ?? 才能有params 方法??
@@index_query = block
# self.index_resouces = block.call(self.resources)
end
def remove_methods *method_names
method_names.each { |name| self.remove_method name }
end
end
before_action :set_resource, except: [:index, :create]
respond_to :json
def index
page = params[:page] || 1
per_page = params[:per_page] || 10
@resources = index_resources.paginate(page: page, per_page: per_page)
respond_with @resources, template: "#{@@template_dir}/index"
end
module Controller
class Base < ApplicationController
# The resources of this controller
# ActiveRecord::Relation or ActiveRecord::Base
cattr_accessor :resources
# The view template dir
# respond_with @products, template: "#{self.class.template_dir}/index"
cattr_accessor :template_dir
class << self
# Add the index query to custom the @@index_resouces on the base of @@resources
# Foe example:
#
# index_query do |klass|
# klass.where(product: params[:product_id]).order('desc')
# end
#
def index_query &block
# 为了保证 self 为Controller instance variable ?? 才能有params 方法??
@@index_query = block
# self.index_resouces = block.call(self.resources)
end
def show
respond_with @resource, template: "#{@@template_dir}/show"
end
def remove_methods *method_names
method_names.each { |name| self.remove_method name }
end
def create
default_resources.create!(resource_params)
head 201
end
def update
@resource.update!(resource_params)
head 200
end
def destroy
@resource.destroy!
head 204
end
def resources= klass_name
retries ||= 1
@@resources = klass_name.constantize
rescue NameError
# If Product havent been load, ProductSeries or ProductSnapshot would not exists
unless (retries =- 1) < 0
klass_name.remove('Series', 'Snapshot').constantize
retry
else
raise
end
end
end
before_action :set_resource, except: [:index, :create]
respond_to :json
private
def index_resources
@@index_query&.call(default_resources) || default_resources
def index
page = params[:page] || 1
per_page = params[:per_page] || 10
@resources = index_resources.paginate(page: page, per_page: per_page)
respond_with @resources, template: "#{@@template_dir}/index"
end
def default_resources
self.class.resources
def show
respond_with @resource, template: "#{@@template_dir}/show"
end
def resource_key
(default_resources.try(:klass) || default_resources).model_name.singular.to_sym
def create
default_resources.create!(resource_params)
head 201
end
def set_resource
@resource = default_resources.find(params[:id])
def update
@resource.update!(resource_params)
head 200
end
def resource_params
params.requrie(resource_key)
def destroy
@resource.destroy!
head 204
end
private
def index_resources
@@index_query&.call(default_resources) || default_resources
end
def default_resources
self.class.resources
end
def resource_key
(default_resources.try(:klass) || default_resources).model_name.singular.to_sym
end
def set_resource
@resource = default_resources.find(params[:id])
end
def resource_params
params.requrie(resource_key)
end
end
end
end
\ No newline at end of file
end
module Shotengai
module Controller
module Merchant
class OrdersController < Shotengai::Controller::Base
end
end
end
end
module Shotengai
module Controller
module Merchant
class ProductSeriesController < Shotengai::Controller::Base
self.resources = 'ProductSeries'
self.template_dir = 'shoutengai/merchant/product_series/'
private
def resource_params
# resource_key = self.resource.model_name.singular.to_sym
# # QUESTION: need these ?
# spec = params.fetch(:spec, nil).try(:permit!)
# datail = params.fetch(:datail, nil).try(:permit!)
# meta = params.fetch(:meta, nil).try(:permit!)
# params.permit(
# :price, :original_price,
# ).merge(
# { spec: spec, detail: detail, meta: meta }
# )
end
end
end
end
end
module Shotengai
module Controller
module Merchant
class SnapshotsController < Shotengai::Controller::Base
end
end
end
end
module Shotengai
module Controller
class ProductsMasterController
cattr_accessor :resource { 'Product' } # 默认值
# respond_with @products, template: "#{self.template_dir}/index"
cattr_accessor :template_dir { 'products/' }
class << self
def resource= resource_name
klass = Object.const_get resource_name
raise ArgumentError.new(
'The resource of Product Controller should be a class inherited from Shotengai::Product'
) unless Shotengai::Product === klass
@@resource = klass
end
module Merchant
class ProductsController < Shotengai::Controller::Base
self.resources = ::Product
self.template_dir = 'shoutengai/merchant/products/'
index_query do |resource|
# params[:catalogs] nil 返回所有
resource.tagged_with(params[:catalogs])
end
before_action :set_product, expect: [:index, :create]
respond_to :json
def index
@products = self.resource.all
respond_with @products, template: "#{self.template_dir}/index"
end
def show
@product = self.resource.find(params[:id])
respond_with @product, template: "#{self.template_dir}/show"
# need series list here
end
def create
self.resource.create!(product_params)
head 201
def put_on_shelf
@resource.put_on_shelf!
head 200
end
def update
self.resource.update!(product_params)
def sold_out
@resource.sold_out!
head 200
end
resource.aasm.state_machine.events.map(&:first).each do |event|
define_method(event) do
@product.send("#{event}!")
head 200
end
def destroy
@resource.soft_delete!
head 204
end
private
def set_resource
@product = self.resource.find(params[:id])
end
def product_params
def resource_params
resource_key = self.resource.model_name.singular.to_sym
# QUESTION: need these ?
spec = params.require(resource_key).fetch(:spec, nil).try(:permit!)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment