2009-02-24 3 views
55

Я знаю, что это может быть глупый вопрос, но я не знаю, как создать рубиновый метод, который принимает хэш параметров. Я имею в виду, в Rails Я хотел бы использовать этот метод следующим образом:Создайте рубиновый метод, который принимает хэш параметров

login_success :msg => "Success!", :gotourl => user_url 

Что является прототипом метода, который принимает этот вид параметров? Как их читать?

ответ

59

Если вы передадите параметрам функцию Ruby в синтаксисе хэша, Ruby предположит, что это ваша цель. Таким образом:

def login_success(hsh = {}) 
    puts hsh[:msg] 
end 
+0

Не могу ли я использовать что-то вроде login_success (* params)? – collimarco

+5

a * (aka splat operator) означает, что метод принимает любое количество аргументов и помещает их в массив с параметрами. Решение о том, использовать его или нет, зависит от того, что вам нужно. В приведенном примере хэш имеет смысл. – Allyn

+6

Это говорит о том, что вы ожидаете сколько-нибудь аргументов. Как 'foo (1,: b, '3')'. Кроме того, вам не нужна часть «= {}». это будет работать нормально: def login_success (hash). Вышеприведенный код просто устанавливает значение по умолчанию как пустой хэш. –

30

ключевая вещь, чтобы помнить о том, что вы можете сделать только синтаксис, где вы выходите из хэш-символы {}, если параметр хэш является последним параметром функции. Итак, вы можете делать то, что сделал Аллин, и это сработает. Также

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" 

Но если хэш не последний параметр, который вы должны окружить хэш-элементы с {}.

5

Используйте один единственный аргумент. Рубин преобразует названные значения в хэш:

def login_success arg 
# Your code here 
end 

login_success :msg => 'Success!', :gotourl => user_url 
# => login_success({:msg => 'Success!', :gotourl => user_url}) 

Если вы действительно хотите, чтобы убедиться, что вы получите хэш вместо рубина по умолчанию утка печатая, то вам нужно будет контролировать его. Нечто подобное, например:

def login_success arg 
    raise Exception.new('Argument not a Hash...') unless arg.is_a? Hash 
    # Your code here 
end 
5

С появлением именованных аргументов в 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

+2

Вы также можете указать, что вы можете оставить значения по умолчанию в Ruby 2.1, чтобы сделать необходимые параметры, например. 'def login_success (msg :, gotourl:)' приведет к возникновению ошибки, если вы попытаетесь вызвать 'login_success', если не будут указаны параметры' msg' и 'gotourl'. – Ajedi32

Смежные вопросы