class Card module Env # Success objects class Success include Location include Target attr_accessor :name, :name_context, :reload attr_writer :params, :redirect, :card attr_reader :id def initialize name_context=nil, success_args=nil @name_context = name_context @new_args = {} @params = OpenStruct.new self << normalize_success_args(success_args) end def to_url name_context=@name_context target = target name_context target.is_a?(Card) ? target.format.path(params) : target end def in_context name_context self.name_context = name_context self end def << value if value.is_a? Hash apply value else self.mark = value end end def redirect @redirect.present? ? @redirect : false end def reload? @reload.to_s == "true" end def []= key, value if respond_to? "#{key}=" send "#{key}=", value else @params.send "#{key}=", value end end def [] key if respond_to? key.to_sym send key.to_sym else @params.send key.to_sym end end def flash message=nil @params[:flash] ||= [] @params[:flash] << message if message @params[:flash] end def params @params.marshal_dump end def session Card::Env.session end private def respond_to_missing? method, _include_private=false method.match?(/^(\w+)=?$/) || super end def method_missing method, *args return super unless (m = method.match(/^(\w+(=)?)/)) infer_bracket m[1].to_sym, m[2], args[0] end def infer_bracket method, assign, val args = [method] args << val if assign @params.send(*args) end def apply hash hash.each_pair do |key, value| next unless value.present? self[key] = value end end def normalize_success_args success_args case success_args when nil self.mark = "_self" {} when ActionController::Parameters success_args.to_unsafe_h else success_args end end end end end