Ответ 1
Если вы передадите параметрам функцию Ruby в синтаксисе хэша, Ruby предположит, что это ваша цель. Таким образом:
def login_success(hsh = {})
puts hsh[:msg]
end
Я знаю, что это может быть глупый вопрос, но я не знаю, как создать рубиновый метод, который принимает хэш параметров. Я имею в виду, что в Rails я хотел бы использовать такой метод:
login_success :msg => "Success!", :gotourl => user_url
Каков прототип метода, который принимает такие параметры? Как я их читаю?
Если вы передадите параметрам функцию Ruby в синтаксисе хэша, Ruby предположит, что это ваша цель. Таким образом:
def login_success(hsh = {})
puts hsh[:msg]
end
Следует помнить, что вы можете выполнять синтаксис, когда вы не учитываете хэш-символы {}, если хэш-параметр является последним параметром функции. Итак, вы можете делать то, что сделал Аллин, и это сработает. Также
def login_success(name, hsh)
puts "User #{name} logged in with #{hsh[:some_hash_key]}"
end
И вы можете называть его
login_success "username", :time => Time.now, :some_hash_key => "some text"
Но если хэш не является последним параметром, вы должны окружить хэш-элементы с помощью {}.
Используйте один единственный аргумент. Ruby преобразует именованные значения в хэш:
def login_success arg
# Your code here
end
login_success :msg => 'Success!', :gotourl => user_url
# => login_success({:msg => 'Success!', :gotourl => user_url})
Если вы действительно хотите убедиться, что вы получаете хеш, вместо типичного ввода ruby-ути, вам нужно будет управлять им. Что-то вроде, например:
def login_success arg
raise Exception.new('Argument not a Hash...') unless arg.is_a? Hash
# Your code here
end
С появлением аргументов Keyword в Ruby 2.0 вы можете теперь делать
def login_success(msg:"Default", gotourl:"http://example.com")
puts msg
redirect_to gotourl
end
В Ruby 2.1 вы можете оставить значения по умолчанию,
def login_success(msg:, gotourl:)
puts msg
redirect_to gotourl
end
При вызове, оставляя параметр, который не имеет значения по умолчанию, поднимет ArgumentError