2013-11-20 3 views
-1

Так что у меня много места в моей программе, где я использую: @user = User.find(params[:id])рельсов - сделать многоразовую User.find

Теперь я хотел сделать новый метод ApplicationController, так что все мои controllers мог бы использовать метод, так что мне не пришлось бы так много повторять мое.

def find_user(params[:id]) 
    @user = User.find(params[:id]) 
end 

Так что теперь, когда я хочу, чтобы отобразить пользователей в какой-то контроллер, я просто введите find_user(params[:id]) в действии. Но по какой-то причине это не работает.

+1

Что именно вы достигаете, определяя этот метод? Байт мудрый, он имеет ту же самую длину. Разумный дизайн, все ваши контроллеры теперь имеют метод, который им может не понадобиться, в то время как 'User.find' был хорошо инкапсулирован в классе User. Является ли ваш метод более сложным, чем то, что вы разделили? – Chandranshu

+1

есть ли у вас какие-либо ошибки? возможно, вы можете попробовать отладить, увидев, что возвращает метод. возможно, вы снова инициализируете переменную где-то ниже. –

+0

Ну в основном я просто пытаюсь практиковать разные вещи, даже если они не самые полезные байт мудрым. – Veske

ответ

1

Сначала я хотел бы сказать, что, хотя это общий вызов, я бы не сделать метод для этого, потому что это уже по существу только один метод вызова, но здесь:

Вы делаете это слишком сложно:

в контроллере приложения

def find_user(user_id) 
    @user = User.find(user_id) 
end 

в контроллере вы используете его в

find_user(params[:id]) 

В качестве альтернативы, если по каким-то причинам вы не хотите писать Params каждый раз

В контроллере приложения

def find_user(paramsicle) # params might be reserved 
    @user = User.find(paramsicle[:id]) 
end 

В контроллере вы используете его в

find_user(params) 

EDIT: Возможно, было бы полезно, если бы я объяснил, почему урс не работает ...

У вас все хорошо, за исключением того, что аргументы метода (материал в скобках) должны быть просто идентификатором, за исключением особых случаев (необязательные аргументы, вещи * args). Узнайте больше об этом here. Проблема заключалась не в параметрах, а в попытке получить доступ к идентификатору, пока он еще находится в разделе аргументов. Вот почему впоследствии было вызвано paramsicle [: id].

+0

Но если я сейчас воспользуюсь последней опцией и введите что-то в 'find_user (params)', скажем 'find_user (4)', не сделал бы это что-то вроде этого в методе, который я определил: '@user = User.find (4 [: ID]) '? – Veske

+0

в этом случае, используйте только первый способ. Поскольку первый метод действительно просто вызывает 'User.find' на все, что передается ему. Я обновил свой ответ, чтобы объяснить, почему вы не можете определить это определение, но ссылка, которую я опубликовал, может помочь еще больше –

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