отвечать только на json в rails

В моем приложении rails, которое является только json, я хочу отправить код 406, когда кто-то вызывает мое приложение rails с принятым заголовком, установленным на все, кроме приложения/json. Я также хочу, чтобы он отправил 415, когда я установил тип контента для чего угодно, кроме приложения/json

У моих контроллеров есть response_to: json надел их. Я выполняю только json во всех действиях. Однако как я могу гарантировать, что я верну код ошибки 406/415 для всех вызовов на все, что вызывается для всех других заголовков/типов контента, и с форматом, установленным на все, кроме json.

Например. Если я мой ресурс - это книги/1, я хочу разрешить книги/1.json или книги/1 с приложением/json в заголовке accept и типе содержимого

Любые идеи о том, как я могу сделать эти два действия?

13
nl ja de
Разве это не будет 406 Not Acceptable вместо 415 ?
добавлено автор pduersteler, источник
Аналогичный вопрос, отвечая как на запрос json-only, так и на json-only: stackoverflow.com/questions/21978580/…
добавлено автор csi, источник
@pduersteler, да, позвольте мне исправить свой вопрос. Мне нужны оба!
добавлено автор av501, источник

3 ответы

В принципе, вы можете ограничить свои ответы двумя способами.

Во-первых, для ваших контроллеров есть reply_to . Это автоматически вызовет 406 Not Acceptable , если будет выполнен запрос для формата, который не определен.

Пример:

class SomeController < ApplicationController
  respond_to :json


  def show
    @record = Record.find params[:id]

    respond_with @record
  end
end

Другим способом было бы добавить before_filter , чтобы проверить формат и соответственно отреагировать.

Пример:

class ApplicationController < ActionController::Base
  before_filter :check_format


  def check_format
    render :nothing => true, :status => 406 unless params[:format] == 'json' || request.headers["Accept"] =~ /json/
  end
end
33
добавлено
Потому что кто-то пытался его отредактировать; Поэтому вопрос и этот ответ для rails3; для более современных версий рельсов используйте before_action вместо before_filter (которого нет в rails3, поэтому редактирование отклоняется)
добавлено автор pduersteler, источник
Вы говорите «return error, если формат json OR не принимает json». Это кажется мне неправильным. Вы хотите вернуть ошибку, если условия BOTH не выполнены.
добавлено автор berkes, источник
Вместо params [: format] == ​​"json" || request.headers ["Accept"] = ~/json/ вы можете использовать request.format.symbol ==: json .
добавлено автор ciastek, источник
Метод reply_to был удален из Rails 4, используйте gem , если вы хотите использовать его.
добавлено автор d_rail, источник

Вы можете сделать это с помощью before_filter в ApplicationController

before_filter :ensure_json_request

def ensure_json_request
  return if params[:format] == "json" || request.headers["Accept"] =~ /json/
  render :nothing => true, :status => 406
end
9
добавлено

На рельсах 4.2+ response_to был удален, поэтому, если вы не хотите импортировать полнофункциональный самоцветов только для этого, лучше всего сворачивать самостоятельно. Это то, что я использую в своих рельсах 5 апи:

    class ApplicationController < ActionController::API
      before_action :force_json

      private
      def force_json
        # if params[_json] it means request was parsed as json 
        # if body.read.blank? there was no body (GET/DELETE) so content-type was meaningless anyway
        head :not_acceptable unless params['_json'] || request.body.read.blank?
      end
    end
1
добавлено
pro.ruby
pro.ruby
1 181 участник(ов)

Язык программирования Ruby Additional docs: https://rubyreferences.github.io/rubyref/ Invite: https://telegram.me/joinchat/Be4rsT2NuB3CyJaF26j1kA Кто хочет компилировать: @crystal_ru (его синтаксис основан на Ruby) Участник @proDOT

Ruby, Rails, Hanami | dry-rb
Ruby, Rails, Hanami | dry-rb
1 180 участник(ов)

https://telegram.me/rubyjob - Ruby Job По вопросам - @eugene_shved

Ruby School .us
Ruby School .us
1 045 участник(ов)

Чат-болталка для учеников руби-школы и не только. Правила: https://telegra.ph/Pravila-chata-Rubi-shkoly-03-13

Random Ruby Chat
Random Ruby Chat
589 участник(ов)

Правила публикации вакансий: https://t.me/codenamecrud/60865

Rubyata
Rubyata
333 участник(ов)

Коммюнити Ruby и Ruby On Rails Флуд не приветствуются. Вакансии можно публиковать только и ТОЛЬКО по пятницам с хештегом #вакансия.

Ruby Talks
Ruby Talks
236 участник(ов)

Национальная Флеймотека

RubyRush
RubyRush
189 участник(ов)

rubyrush.ru программирование для самых новичков

Rails Chat
Rails Chat
87 участник(ов)

You are welcome to discuss Ruby On Rails development process and other stuff