2013-12-04 2 views
1

Я хочу использовать этот кусок кода, чтобы получить список пользователя кредитных карт в файле с полоской, чтобы показать на своем профиле (/ пользователи /: идентификатор)Рекомендации по использованию Rails - контроллер или модель?

@stripe_cards = Stripe::Customer.retreive(self.stripe_customer_id).cards.all

Дело в том, что я не точно, где (с точки зрения лучшей практики Rails) он подходит. Моей первой задачей является поместить ее в демонстрационный метод пользовательского контроллера, поскольку он не является бизнес-логикой и не вписывается в модель. Я также рассмотрел вспомогательные методы, но они кажутся (по моему мнению) строго используемыми при работе с HTML.

Может ли кто-нибудь из вас использовать Rails?

Спасибо! Francis

+0

показать метод контроллера пользователя выглядит хорошо для меня – shiva

+1

я бы, вероятно, положил аксессор на обычае, который принимает идентификатор пользователя и возвращает карты (то есть, если я правильно понимаю ваши модели). Затем в контроллере вам не нужно будет вызывать retreieve или cards.Кроме того, все это необходимо? – kddeisz

+0

@ musicnerd47 Не могли бы вы рассказать о «аксессуре на таможне», о котором вы упомянули? Кроме того, я сейчас использую .all и знаю, что в конечном итоге могут возникнуть проблемы, но усомниться в том, что у пользователей может быть много действительных кредитных карт в файле :) –

ответ

4

Хороший вопрос. Всякий раз, когда вы видите переменную экземпляра в рельсах (начиная с @), она обычно является битом представления/контроллера.

@stripe_cards = Stripe::Customer.retreive(self.stripe_customer_id).cards.all 

Однако, глядя на хвостовом конце этого

Stripe::Customer.retreive(self.stripe_customer_id).cards.all 

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

# user.rb 

def stripe_customer_cards 
    Stripe::Customer.retreive(self.stripe_customer_id).cards.all 
    rescue Stripe::InvalidRequestError 
    false # You could use this to render some information in your views, without breaking your app. 
end 

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

EDIT

Оказывать сообщение об ошибке, просто написать вызов для перенаправления или визуализации, с возможностью alert.

if @stripe_cards = current_user.stripe_customer_cards 
    # Your being paid, sweet! 
else 
    # Render alert info :(
    render 'my_view', alert: 'This is an alert' 
    redirect_to other_path, alert: 'Another alert' 
end 

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

  • пользователи путайте
  • сделать ошибки в коде сложнее исправить
  • Преувеличивайте время до признана ошибка
+0

Nitpick: @ не указывает глобальную переменную, она указывает переменную с узлом класса экземпляра. Глобальные переменные начинаются с $, и вы (надеюсь) найдете их редко в приложениях Rails. @@ является областью действия класса (или, в некоторых случаях, областью модуля), аналогичной статической переменной на других языках. – JasonTrue

+0

@ bwheeler96 Спасибо за отличный ответ, я не рассматривал часть обработки ошибок, когда я разместил вопрос. Говоря об этом, я не уверен, что понимаю, как я мог бы сделать это на мой взгляд. Я использую флеш-сообщения прямо сейчас с оповещениями Bootstrap. –

+1

Обработка ошибок в представлении - это длительный разговор, предупреждение о загрузке - отличный вариант для ** большинства ** случаев. – OneChillDude

2

Я бы рекомендуется добавить виртуальный атрибут в вашей User модели:

# app/models/user.rb 
def cards 
    Stripe::Customer.retrieve(stripe_customer_id).cards.all # note the spelling of `retrieve` 
end 

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

user = User.first 
#=> #<User id:1> 

user.cards 
#=> [Array of all cards] 
Смежные вопросы