web-dev-qa-db-ja.com

Rails 3-リソースルートでのアクションの制限形式

ルートにリソースが定義されています。

resources :categories

そして、私は私のカテゴリーコントローラーに以下を持っています:

  def show
    @category = Category.find(params[:id])

    respond_to do |format|
      format.json { render :json => @category }
      format.xml  { render :xml => @category }
    end
  end

コントローラアクションは、jsonとxmlで正常に動作します。ただし、コントローラがhtml形式のリクエストに応答することは望ましくありません。 jsonとxmlのみを許可するにはどうすればよいですか?これは、showアクションでのみ発生します。

これを達成するための最良の方法は何ですか?また、respond_toブロックを乾燥させるための良いヒントはありますか?

ご協力いただきありがとうございます。

36
Mike

これは機能しているように見えました(正しい方向を示してくれた@Panに感謝します)。

resources :categories, :except => [:show]
resources :categories, :only => [:show], :defaults => { :format => 'json' }

上記は、デフォルトでjsonとして、ルータにフォーマットなしのリクエストをshowアクションに強制的に提供するように思われます。

41
Mike

これらのルートを特定の形式(htmlまたはjsonなど)に制限する場合は、それらのルートをスコープでラップする必要があります。残念ながら、この場合、制約は期待どおりに機能しません。

これはそのようなブロックの例です...

scope :format => true, :constraints => { :format => 'json' } do
  get '/bar' => "bar#index_with_json"
end

詳細はここにあります: https://github.com/Rails/rails/issues/5548

この回答は、私の以前の回答のコピーです。

Railsルート-リソースで使用可能な形式の制限

36
koonse

Routes.rbファイルで以下を実行して、showアクションのみがjsonまたはxmlに制約されていることを確認できます。

resources :categories, :except => [:show]
resources :categories, :only => [:show], :constraints => {:format => /(json|xml)/}

これが機能しない場合は、アクションを明示的に照合してみてください。

resources :categories, :except => [:show]
match 'categories/:id.:format' => 'categories#show', :constraints => {:format => /(json|xml)/}
24
Pan Thomakos

constraintsがPOSTリクエストに対して機能しなかったため、defaultsを試しましたが、すべての機能で機能します。

namespace :api, :defaults => { :format => 'json' } do
    namespace :v1 do
      resources :users do
        collection do
          get 'profile'
        end
      end
      post 'signup' => 'users#create'
      post 'login' => 'user_sessions#create'
  end
end

Rails 4.2.7

0
A H K