2016-08-13 13 views
0

Я делаю это в моей функции редактирования, обновления, уничтожитьоптимизируют код рубин рельсы

@post = Post.friendly.find(params[:id]) 
if @post.user_id == current_user.id 

там какой-нибудь способ оптимизировать и сделать одну функцию, вы использовали, чтобы это нравится:

before_action :set_user_post, only: [:edit, :update, :destroy] 

private 
def set_user_post 
    @post = current_user.posts.find_by(id: params[:id]) 
end 

Но добавьте драгоценный камень friendly_id и измените его следующим образом:

private 
def set_user_post 
    @post = current_user.posts.friendly.find(id: params[:id]) 
end 

Но это дает мне ошибку. ошибка:

Mysql2::Error: Unknown column 'id.id' in 'where clause': SELECT `posts`.* FROM `posts` WHERE `posts`.`user_id` = 1 AND `id`.`id` = 'primero' LIMIT 1 
+0

Какая ошибка возникает у вас? Отправьте сообщение об ошибке, включая имя файла и номер строки и полную трассировку стека. – spickermann

+0

Ошибка: Mysql2 :: Ошибка: Неизвестный столбец 'id.id' в 'where clause': SELECT 'posts'. * FROM' posts' WHERE 'posts'.'user_id' = 1 AND' id'.'id' = 'primero' LIMIT 1 @spickermann –

ответ

0

Метод find находит запись по идентификатору, и вы можете передать только один идентификатор или массив идентификаторов в качестве входных данных. Но в вашем методе вы передаете хэш. Измените метод set_user_post, как

def set_user_post 
    begin 
    @post = current_user.posts.friendly.find(params[:id]) 
    rescue ActiveRecord::RecordNotFound 
    redirect_to root_path, alert: 'You are knocking at the wrong door' 
    end 
end 

Если пользователь пытается получить доступ к пост другого пользователя, метод find возбудит исключение, потому что мы находим посты в current_user. Мы можем спасти исключение и перенаправить пользователя на домашнюю страницу с предупреждающим сообщением .

EXTRA

Вы также можете найти запись, используя find_by метод и передать его хэш. Этот метод используется для поиска записи с любым полем (а не только с id). Он возвращает первую запись, которая соответствует запросу.

Например,

def set_user_post 
    @post = current_user.posts.friendly.find_by(id: params[:id]) 
end 

Это делает то же самое, но разница в том, что find поднимает ActiveRecord::RecordNotFound исключение, если запись не существует с заданным идентификатором, а find_by возвращает nil, если запись не существовать.

Для получения дополнительной информации см. http://apidock.com/rails/ActiveRecord/FinderMethods/find

+0

спасибо, это работает, но если не создатель сообщения, как перенаправлено, так что это сообщение не появляется мне: ActiveRecord :: RecordNotFound @Arun Kumar –

+0

@ CarlosUrielPatiñoSantiago Я тебя не понимаю , Можете ли вы объяснить немного более четко? Вы получаете сообщение об ошибке или можете ли пользователь редактировать другие сообщения? –

+0

ok, example: Я верю, что этот вопрос только я могу отредактировать, но если другой пользователь хочет отредактировать и поместить в url: question/edit, показывает это об ошибке: ActiveRecord :: RecordNotFound, но я хочу перенаправить начало, так как Я извиняюсь за любые неудобства, которые только начинаются, и у меня много сомнений, @Aurun Kumar –

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