Что является более похожим на Ruby способом выполнения этой команды? - PullRequest
3 голосов
/ 10 января 2011

Я хочу сделать это:

sender_email = @request.user.paypal_email if @request.user.paypal_email == "paypal@anonymous.com"

Так что в основном я хочу выполнить команду, только если электронная почта пользователей PayPal равна "paypal@anonymous.com". Это прекрасно работает, но, похоже, есть место для рефакторинга.

Ответы [ 3 ]

9 голосов
/ 10 января 2011
@request.user.paypal_email

Некоторые отстаивают, что вы «используете только одну точку».( См. «Закон Деметры». ) Возможно, вы захотите использовать Rails метод «делегата»

class User < ActiveRecord::Base
  has_many :requests
end

class Request < ActiveRecord::Base
  belongs_to :user

  delegate :paypal_email, :to => :user
end

Тогда вы можете написать

@request.paypal_email

или, если хотите,

class Request < ActiveRecord::Base
  belongs_to :user

  delegate :paypal_email, :to => :user, :prefix => true
end

@request.user_paypal_email
5 голосов
/ 10 января 2011

Так как этот код находится в вашем контроллере, то он, безусловно, может быть реорганизован. Обычно вы хотите, чтобы подобная логика присутствовала в моделях, так как писать модульные тесты легко, и контроллер не должен так много знать о модели пользователя.

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

def User < ActiveRecord::Base
  def sender_email
    paypal_email if paypal_email == "paypal@anonymous.com"
  end
end

Тогда вашему контроллеру не нужно будет знать столько же, и он может просто сделать:

sender_email = @request.user.sender_email
0 голосов
/ 10 января 2011

Конечно, вы можете переписать, используя блок if, но единственная разница - это гибкость в будущем или «читаемость». Может быть, ваш вопрос должен звучать так: «Предоставляет ли рельсы то, что делает это?» Ответ на этот вопрос не тот, о котором я знаю. Если ваш код делает то, что вы хотите, я не вижу причин для его изменения.

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