Возвращает json в индексном действии, но не позволяет пользователям получать доступ к маршруту в Rails

#ruby-on-rails

#ruby-on-rails

Вопрос:

У меня есть приложение rails, как спереди, так и сзади. На передней панели есть несколько компонентов React, которые извлекают данные. В этом случае он получает комментарии в блоге. Но в приложении вы также можете перейти к /blogs/3/comments , что не то, что я хочу. Я не хочу, чтобы люди получали доступ /blogs/3/comments , но я хочу, чтобы конечная точка существовала.

routes.rb

   resources :blogs do
    resources :comments, only: [:show, :index]
  end
  

В comment_controller.rb у меня есть

   def index
    blog = Blog.find(params[:blog_id])
    @comments = blog.comments.select("comments.*, users.name").joins(:user)
    render json: { comments: @comments }
  end
  

Когда я выполняю запрос get с помощью fetch или axios для получения комментариев в блоге, он успешно возвращает мне json, но на веб-сайте пользователь также может перейти /blogs/3/comments , и он покажет json.

 {"comments":[{"id":3,"content":"lorem ...","created_at":"2020-09-11T01:55:56.281Z","updated_at":"2020-09-11T01:55:56.281Z","blog_id":3,"user_id":1,"name":"user1"},{"id":2,"content":"lorem ...s","created_at":"2020-09-11T01:55:56.262Z","updated_at":"2020-09-11T01:55:56.262Z","blog_id":3,"user_id":1,"name":"user2"},{"id":1,"content":"lorem ...","created_at":"2020-09-11T01:55:56.240Z","updated_at":"2020-09-11T01:55:56.240Z","blog_id":3,"user_id":1,"name":"user1"}]}
  

Есть ли способ не разрешить пользователю доступ /blogs/3/comments ? И пусть конечная точка работает для получения запроса от других клиентов?

Ответ №1:

Я предполагаю, что вы имеете в виду, что вы не хотите, чтобы конечная точка была доступна для текстовых / html-запросов.

 def index
 blog = Blog.find(params[:blog_id])
 @comments = blog.comments.select("comments.*, users.name").joins(:user)
 respond_to do |format|
   format.json { render json: { comments: @comments } }
   format.html { redirect_to '/somewhere_else', status: :not_acceptable }
 end
end
  

Смотрите ActionController::MimeResponds.