Skip to content

Instantly share code, notes, and snippets.

@gzfrancisco
Last active August 29, 2015 14:23
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gzfrancisco/59b4b3297b61867fdf9b to your computer and use it in GitHub Desktop.
Save gzfrancisco/59b4b3297b61867fdf9b to your computer and use it in GitHub Desktop.
Rails 4 permit params DSL
def method_missing(symbol, *args, &block)
p "Start method_missing from #{self} at #{symbol}"
return unless symbol.to_s.start_with?('permit_params_from_')
object = symbol.to_s.sub('permit_params_from_', '')
context = []
def context.method_missing(symbol, &block_b)
p "Start context from #{self} at #{symbol}"
second_context = []
def second_context.method_missing(symbol)
self << symbol
end
if block_given?
second_context.instance_eval(&block_b)
self << Hash[symbol, second_context]
else
self << symbol
end
p "Finish context from #{self} at #{symbol}"
end
context.instance_eval(&block)
p "Finish from #{self} at #{symbol}"
command = "params.require(#{object.to_sym}).permit(#{context})"
p command
puts context.inspect
end
permit_params_from_product_server do
id
name
sku
email do
username
server
end
home
number
serial_number
image
end
@gzfrancisco
Copy link
Author

Is not my best code, but my first DLS.

Output:

"Start method_missing from main at permit_params_from_product_server"
"Start method_missing from  at to_hash"
"Start context from [] at id"
"Finish context from [:id] at id"
"Start context from [:id] at name"
"Finish context from [:id, :name] at name"
"Start context from [:id, :name] at sku"
"Finish context from [:id, :name, :sku] at sku"
"Start context from [:id, :name, :sku] at email"
"Finish context from [:id, :name, :sku, {:email=>[:username, :server]}] at email"
"Start context from [:id, :name, :sku, {:email=>[:username, :server]}] at home"
"Finish context from [:id, :name, :sku, {:email=>[:username, :server]}, :home] at home"
"Start context from [:id, :name, :sku, {:email=>[:username, :server]}, :home] at number"
"Finish context from [:id, :name, :sku, {:email=>[:username, :server]}, :home, :number] at number"
"Start context from [:id, :name, :sku, {:email=>[:username, :server]}, :home, :number] at serial_number"
"Finish context from [:id, :name, :sku, {:email=>[:username, :server]}, :home, :number, :serial_number] at serial_number"
"Start context from [:id, :name, :sku, {:email=>[:username, :server]}, :home, :number, :serial_number] at image"
"Finish context from [:id, :name, :sku, {:email=>[:username, :server]}, :home, :number, :serial_number, :image] at image"
"Finish from main at permit_params_from_product_server"
"params.permit(product_server).require([:id, :name, :sku, {:email=>[:username, :server]}, :home, :number, :serial_number, :image])"
[:id, :name, :sku, {:email=>[:username, :server]}, :home, :number, :serial_number, :image]

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