Я столкнулся с ситуацией, когда «current_user» должен быть тесно связан с моделью, но я обработал все это в контроллере, и он работает довольно хорошо.Вот несколько примеров:
Моя модель "Фотографии".Фотографии принадлежат пользователям, и то, как люди взаимодействуют с фотографиями, очевидно, тесно связано с тем, имеют ли они фотографию или нет.
В действии шоу мне нужно загрузить либо существующий рейтинг, который пользователь дал фотографии(чтобы они могли редактировать его) или позволить им создать новый:
def show
@photo = Photo.find(params[:id])
if user_signed_in?
if @rating = current_user.ratings.find_by_photo_id(params[:id])
@rating
@current_user_rating = @rating.value
else
@rating = current_user.ratings.new
@current_user_rating = "n/a"
end
end
end
Когда люди создают фотографии, я хочу, чтобы они автоматически назначались текущему пользователю.
def new
@photo = Photo.new
end
def create
@photo = current_user.photos.create(params[:photo])
if @photo.save
redirect_to user_path(current_user), :notice => t('photo.notice.created')
else
render 'new'
end
end
Только владельцы фотографии могут изменять их:
def edit
@photo = Photo.find(params[:id])
if @photo.user == current_user
render 'edit'
else
redirect_to user_path(current_user), :alert => t('application.error.unauthorized')
end
end
def update
@photo = current_user.photos.find_by_id(params[:id])
@photo.update_attributes(params[:photo])
if @photo.save
redirect_to user_path(current_user), :notice => t('photo.notice.updated')
else
render 'edit'
end
end
Этот подход основан на ограничениях, которые объект "current_user" привязывает к сеансу, о которых знает только контроллер.Итак, короче говоря, мне еще предстоит найти хороший способ интегрировать «current_user» в модель, но я смог найти (я думаю) довольно чистые способы связать модель и контроллер так, чтобы это можно было обеспечитьконтроллером.
Одним из довольно простых решений большинства проблем, если ваш контроллер начинает запутываться, было бы взять кусок логики и определить его как метод в модели, но требовать один аргумент = aпользовательский объект.Затем вы можете просто передать «current_user» этому методу с вашего контроллера, а модель обработает все остальное.
Удачи!Кроме того, если у кого-то есть идеи получше, я бы хотел их услышать!