Skip to content

Instantly share code, notes, and snippets.

@r7kamura
Last active August 29, 2015 14:10
Show Gist options
  • Save r7kamura/b3ec44521bb939fb8c99 to your computer and use it in GitHub Desktop.
Save r7kamura/b3ec44521bb939fb8c99 to your computer and use it in GitHub Desktop.
module MyApp
module Parameters
class Base
include ActiveModel::Validations
class << self
attr_writer :parameter_names
def inherited(base)
super.tap do
base.parameter_names = parameter_names.dup
end
end
def parameter(parameter_name)
parameter_names << parameter_name
define_method(parameter_name) do
@parameters[parameter_name]
end
end
def parameter_names
@parameter_names ||= []
end
end
def initialize(parameters)
@parameters = parameters
end
def to_hash
@parameters.slice(*self.class.parameter_names).symbolize_keys
end
end
end
end
# これをactionごとに書く
module MyApp
module Parameters
class CreatePreview < Base
parameter :raw_body
validates :raw_body, length: { allow_nil: false, minimum: 0 }
end
end
end
# controllerではこう使う
class PreviewsController < ApplicationController
before_action :require_valid_parameters_for_create_action, only: [:create]
def create
render json: Preview.new(params_for_create_action.to_hash)
end
private
def params_for_create_action
@params_for_create_action ||= MyApp::Parameters::CreatePreview.new(params)
end
def require_valid_parameters_for_create_action
raise MyApp::Errors::InvalidParameters, params_for_create_action unless params_for_create_action.valid?
end
end
@r7kamura
Copy link
Author

r7kamura commented Dec 8, 2014

validates :foo, bar: true とかやるとBarValidatorが使われる。このBarValidatorとかをクラス間で共有できるので便利。あとクラスからvalidationのルールを取り出せるので、actionとクラスの命名規則を揃えておけば、actionの名前からvalidationのルールを取り出せるということになる。この情報からAPIのドキュメントを組み立てられる。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment