Class: ActionController::Routing::DynamicComponent
Overview
Instance Attribute Summary collapse
Instance Method Summary
collapse
Methods inherited from Component
new
Constructor Details
#initialize(key, options = {}) ⇒ DynamicComponent
Returns a new instance of DynamicComponent.
101
102
103
104
105
|
# File 'lib/action_controller/routing.rb', line 101
def initialize(key, options = {})
@key = key.to_sym
default, @condition = options[:default], options[:condition]
self.default = default if options.key?(:default)
end
|
Instance Attribute Details
#condition ⇒ Object
Returns the value of attribute condition.
91
92
93
|
# File 'lib/action_controller/routing.rb', line 91
def condition
@condition
end
|
Returns the value of attribute default.
90
91
92
|
# File 'lib/action_controller/routing.rb', line 90
def default
@default
end
|
Returns the value of attribute key.
90
91
92
|
# File 'lib/action_controller/routing.rb', line 90
def key
@key
end
|
Instance Method Details
#add_segments_to(g) ⇒ Object
144
145
146
|
# File 'lib/action_controller/routing.rb', line 144
def add_segments_to(g)
g.add_segment(%(\#{CGI.escape(#{g.hash_value(key, true, default)})})) {|gp| yield gp}
end
|
#assign_default(g) ⇒ Object
179
180
181
|
# File 'lib/action_controller/routing.rb', line 179
def assign_default(g)
g.constant_result key, default unless default.nil?
end
|
#assign_result(g, with_default = false) ⇒ Object
174
175
176
177
|
# File 'lib/action_controller/routing.rb', line 174
def assign_result(g, with_default = false)
g.result key, "CGI.unescape(#{g.next_segment(true, with_default ? default : nil)})"
g.move_forward {|gp| yield gp}
end
|
#default_check(g) ⇒ Object
107
108
109
110
111
112
113
114
|
# File 'lib/action_controller/routing.rb', line 107
def default_check(g)
presence = "#{g.hash_value(key, !! default)}"
if default
"!(#{presence} && #{g.hash_value(key, false)} != #{default.to_s.inspect})"
else
"! #{presence}"
end
end
|
#dynamic? ⇒ Boolean
93
|
# File 'lib/action_controller/routing.rb', line 93
def dynamic?() true end
|
#optional? ⇒ Boolean
94
|
# File 'lib/action_controller/routing.rb', line 94
def optional?() @optional end
|
#recognition_check(g) ⇒ Object
148
149
150
151
152
153
154
155
|
# File 'lib/action_controller/routing.rb', line 148
def recognition_check(g)
test_type = [true, nil].include?(condition) ? :presence : :constraint
prefix = condition.is_a?(Regexp) ? "#{g.next_segment(true)} && " : ''
check = prefix + Routing.test_condition(g.next_segment(true), condition || true)
g.if(check) {|gp| yield gp, test_type}
end
|
#write_continue_generation(g, use_else) ⇒ Object
134
135
136
137
138
139
140
141
142
|
# File 'lib/action_controller/routing.rb', line 134
def write_continue_generation(g, use_else)
test = Routing.test_condition(g.hash_value(key, true, default), condition || true)
check = (use_else && condition.nil? && default) ? [:else] : [use_else ? :elsif : :if, test]
g.send(*check) do |gp|
gp.expire_for_keys(key) unless gp.after.empty?
add_segments_to(gp) {|gpp| gpp.continue}
end
end
|
#write_dropout_generation(g) ⇒ Object
121
122
123
124
125
126
127
128
129
130
131
132
|
# File 'lib/action_controller/routing.rb', line 121
def write_dropout_generation(g)
return false unless optional? && g.after.all? {|c| c.optional?}
check = [default_check(g)]
gp = g.dup
check += gp.after.map {|c| c.default_check gp}
gp.if(check.join(' && ')) { gp.finish } true
end
|
#write_generation(g) ⇒ Object
116
117
118
119
|
# File 'lib/action_controller/routing.rb', line 116
def write_generation(g)
wrote_dropout = write_dropout_generation(g)
write_continue_generation(g, wrote_dropout)
end
|
#write_recognition(g) ⇒ Object
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
|
# File 'lib/action_controller/routing.rb', line 157
def write_recognition(g)
test_type = nil
recognition_check(g) do |gp, test_type|
assign_result(gp) {|gpp| gpp.continue}
end
if optional? && g.after.all? {|c| c.optional?}
call = (test_type == :presence) ? [:else] : [:elsif, "! #{g.next_segment(true)}"]
g.send(*call) do |gp|
assign_default(gp)
gp.after.each {|c| c.assign_default(gp)}
gp.finish(false)
end
end
end
|