2015-08-06 2 views
2

Есть ли способ использовать функции разработки внутри модели? Скажем, область?Использование утилит в моделях

Для справки, это то, что я имел в виду:

scope :available, -> { 
    if user_signed_in? 
     requestable 
    else 
     requestable.where.not(books: {owner_id: current_user.id}) 
    end 
} 

я должен был бы использовать user_signed_in? и current_user в этой области. Но я не могу. Есть ли способ сделать это?

+0

Почему вы не можете использовать их? Оба эти метода доступны в других моделях, например, для модели 'User' потребуется разработка, поскольку это цель драгоценного камня. – jkeuhlen

+0

Ohh duh. Они настроены для использования в контроллерах, а не в моделях. Я забыл извинения! – jkeuhlen

+0

Итак, ответ был бы прямым «Нет»? Это было бы нормально (просто неутешительно) :( –

ответ

1

Методы, подобные этим, не предназначены для использования в режиме левая сторона Модели также должны работать вне контроллера (т. Е. Непосредственно из консоли Rails).

Для более детального рассуждения см:

Access to current_user from within a model in Ruby on Rails

Далее нет глобального «магазина», зная, какие пользователь в настоящее время регистрируется - это определяется в запросе, путь veryfying пользователя посылает действительный сеанс информацию с его просьбой.

2

current_user (и то же самое касается вспомогательных помощников, таких как user_signed_in?) доступен только в ваших контроллерах. Я был вокруг этого вопроса и закончил тем, что передал current_user своим областям и методам модели.

В модели:

scope :available, -> (current_user, signed_in) { 
    if signed_in 
     requestable 
    else 
     requestable.where.not(books: {owner_id: current_user.id}) 
    end 
} 

В контроллере:

MyModel.available(current_user, user_signed_in?) 

В качестве альтернативы можно использовать request_store (стойка на основе глобального хранения данных) для хранения current_user тока запрос

+1

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

+1

Хорошая мысль. Хотя я чувствую, что, возможно, там, где MVC достигает своих пределов, мне кажется правильным, чтобы данные, такие как 'current_user', были доступны по всему миру – Benj

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