2

Я нахожусь в дилемме, у меня есть тонна объектов, связанных с current_user в моем приложении. И и не знаю, могу ли в моих контроллерах использовать идентификаторы, чтобы найти эти объекты или поместить непосредственно объект current_user +.Rails current_user best practice

Exemple:

class HousesController < ApplicationController 

def show 
     @house = House.find(params[:id]) **or?** @house = current_user.house 
    end 

def edit 
     @house = House.find(params[:id]) **or?** @house = current_user.house 
    end 
end 

И это происходит и дальше. заранее заблаговременно

+0

Я хотел бы использовать 'params [: id]'. Если позже вы решили добавить дополнительную функцию, например, администраторы могут редактировать любой дом, используя 'current_user.house', это предотвратит это. – pjumble

+0

, так что для гибкости лучше сохранить идентификатор, да, это правда, но вы заметили, что если вы назначаете напрямую, то чувствуете, что получаете заработную плату? – dcalixto

+0

В простом случае, как вы, вы * нигде * рядом с местом, где вам нужно беспокоиться о производительности. – DGM

ответ

4

Если вы используете House.find(params[:id]), у вас есть потенциальное отверстие для безопасности, так как данный пользователь может просто изменить номер в URL-адресе и получить доступ к дому для другого пользователя. Поэтому, если вы идете по этому маршруту, вам нужно добавить что-то, чтобы защитить неприкрытый доступ.

OTOH, current_user.house хранит их в собственном доме, но нуждается в альтернативном коде для функций администратора.

Для простых приложений вы можете сделать это вручную, но для более крупных приложений вы можете рассмотреть рамки авторизации, такие как cancan или declarative_authorization, где вы можете более легко определить разрешения.

Я использую decl_auth себя, и все мои контроллеры либо использовать свой метод загрузки ресурсов с filter_resource_access (загружает соответствующий ресурс или броски и ошибки, если не допускается) или вручную с House.with_permissions_to(:index), который будет только дать мне дом, если я имеют разрешение на его загрузку.

Как всегда, Railscasts говорят это лучше всего: cancan и declarative authorization.

+0

ehh thanks :) Я буду искать один из этих auth! – dcalixto