1

Одна вещь, которую я заметил при работе с вложенными маршрутами ресурсов в Rails, заключается в том, что технически возможно, чтобы пользователь мог посетить маршрут, где существует дочерний ресурс (и поэтому отображается правильно), но идентификатор для родительского ресурса представляет объект, который фактически не связан с дочерним ресурсом.Исправление недопустимых маршрутов ресурсов в Rails

Например, на маршруте users/:user_id/post/:id пользователь может ввести маршрут, где :user_id представляет пользователя, который не сделал сообщение, соответствующее :id.

Что было бы лучшим способом исправить это, чтобы, если пользователь посещает неверный URL-адрес, сервер перенаправляет пользователя на правильный URL-адрес?

Я уже поставил код в своих контроллерах, чтобы справиться с этим, но неудобно проверять путь в каждом действии контроллера, а затем перенаправлять пользователя на соответствующий URL-адрес, тем более, что URL-адреса помощников различны для каждого действие.

(edit_user_post_path(@user, @post), new_user_post_path(@user, @post))

Там должен быть лучше, не так ли?

ответ

2

Вы должны иметь before_filter работаете на все запросы, убеждается пользователь является действительным. Если нет, то он выкинет ActiveRecord::RecordNotFound и покажет дружескую 404 страницу.

Затем возьмите сообщение, основанное на пользователе, однако вам нужно, в другом before_filter или непосредственно в действии. Создайте свой почтовый поиск у пользователя. Мой пример ниже демонстрирует это с другим before_filter.

before_filter :find_user_by_user_id 
before_filter :find_post 

def show 
    # Use @post variable here however you need 
end 

private 

def find_user_by_user_id 
    @user = User.find(params[:user_id]) 
end 

def find_post 
    # This assumes you have an association set up as needed 
    @post = @user.posts.where(id: params[:id]).first 

    if @post.nil? 
    # Do whatever you need here 
    end 
end 
+0

А, я вижу. Если я ищу почту только в пределах сообщений пользователя, у меня не будет этой проблемы. До этого момента я искал должности отдельно. Например. 'Posts.find (PARAMS [ID]:') – Ajedi32

0

Прежде всего, вы должны знать, что ошибка, вызванная ROR, отобразит сообщение «Извините, но страница, которую вы ищете, не существует» в производственной среде.

Для этого меня не волнует. если вы хотите «захватить» сбой и быстро перенаправить в безопасную зону, вам может быть интересно использовать метод rescue.

http://www.simonecarletti.com/blog/2009/12/inside-ruby-on-rails-rescuable-and-rescue_from/

весело

+0

Но что вызывает ошибку? Rails автоматически проверяет правильность родительского ресурса и соответственно реагирует? Обратите внимание, что в моем примере 'Post.find (params [: id])' вернул бы правильную запись и 'User.find (params [: user_id])' также был бы прав, но 'User.find (params [: user_id]). posts.include? (Post.find (params [: id])) 'и' Post.find (params [: id]). user == User.find (params [: user_id]) ' оба будут ложными. – Ajedi32

+0

Ошибка вызвана возвратом NilClass в отношении. когда вы пытаетесь найти ресурсы с идентификатором, скажем, пользователь и как вложенный ресурс его сообщениям, вам будет возвращен массив. как только вы решите выделить отдельную запись из массива в действии show с помощью params [: id], он будет искать массив для идентификатора, когда он не может быть найден, он возвращает nil и отображает вывод 404. – dennis

+0

Итак ... он сохраняет массив ресурсов из действия индекса и проверяет его на ресурс, возвращенный в действии show? Я в замешательстве ... FYI, в моей среде разработки ошибка вообще не возвращается, когда я даю маршрут, подобный тому, который приведен в моем примере. – Ajedi32

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

  • Нет связанных вопросов^_^