рельсы, метод, мне нужна помощь - PullRequest
0 голосов
/ 02 марта 2010

Мне нужно написать метод, который возвращает, установлено ли логическое значение true / false.

В моем случае логическое значение является атрибутом для продукта. И чтобы пропустить шаг в процессе оформления заказа, мне нужно, чтобы этот метод self работал следующим образом:

def current_user
  return @current_user if defined?(@current_user)
  @current_user = current_user_session && current_user_session.user
end

этот пример взят из application_controller и делает то же самое в процессе оформления заказа, что и здесь.

Использование для этого, как только у меня это работает:

def checkout_steps                                                      
  checkout_steps = %w{registration billing shipping shipping_method payment confirmation}
  checkout_steps.delete "registration" if current_user
  checkout_steps
end

Мне нужен логический тип, который работает так же, как элемент удаления выше. Я пытаюсь понять, как это работает, поэтому любые объяснения очень ценятся.

мысли

Ответы [ 2 ]

0 голосов
/ 02 марта 2010

Я не совсем уверен, что следую вашему вопросу, но если вы спрашиваете, как работает эта строка:

checkout_steps.delete "registration" if current_user

Это не тот способ, которым current_user возвращает значение, которое делает это.Это встроенный синтаксис Ruby, в котором вы можете указать одну строку, если операторы в следующей форме:

<statment> if <condition> # only execute <statement> if <condition> is true

вместо более традиционного способа:

if <condition> then
  <statement>
end

Как и полныйСинтаксис if / end, Ruby будет оценивать оператор только в том случае, если условие истинно, а условием может быть любой код, который вы обычно можете поместить в условие if.

В вашем случае, если атрибут продукта имеет видcan_be_shipped, указывающий, может ли элемент быть отправлен, вы можете просто сделать

checkout_steps.delete 'shipping' if !@product.can_be_shipped

Rails поддерживает другой синтаксис для проверки того, оценивается ли условие как ложное:

<statment> unless <condition> # only execute <statement> if <condition> is false

Что можно использоватьчтобы сделать логику более понятной:

checkout_steps.delete 'shipping' unless @product.can_be_shipped
0 голосов
/ 02 марта 2010

Попробуйте это:

def current_user
  current_user_session.user if current_user_session
end

def signed_in?
  current_user_session && !current_user_session.user.nil?
end

Тогда я бы переписал ваши check_steps так:

checkout_steps.delete "registration" if signed_in?

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...