13

私は、jobs.html.erb などの html テンプレートしかない Rails 2.1.2 サイトを持っているので、安らかなリソースをリクエストすると、次のようになります。

www.mysite.com/jobs/1

ただし、次のように要求すると、ジョブが html でレンダリングされます。

www.mysite.com/jobs/1.xml

エラーが発生します:

テンプレートがありませんビュー パス c:/workspace/mysite/app/views にテンプレート jobs/show.xml.erb がありません

さらに悪いことに、次のようなこともリクエストできます

www.mysite.com/jobs/1.xyz

そして実際、私はエラーが表示されます:

テンプレートがありませんビュー パス c:/workspace/mysite/app/views にテンプレート jobs/show.xyz.erb がありません

厳密に html コンテンツのみを表示するには、Rails に .html.erb ファイル以外はレンダリングしたくないことを伝える最もクリーンで簡単な方法を教えてください。

次のことに注意することが重要です。

  • 私のコントローラー アクションには render() メソッドへの条件付き呼び出しが含まれているものもあれば、Rails のデフォルトの動作を使用するものもあります。つまり、render() を呼び出さない場合は、youraction.html.erb という名前のテンプレートがレンダリングされます。
  • 私のコードは Responds_to() メソッドを使用していません

かなりの数のアクションを変更する必要があるため、ソリューションが render/responds_to レベルにない場合は素晴らしいでしょう。おそらく、html テンプレートのみがレンダリングされるように Rails を構成する方法はありますか?

4

5 に答える 5

14

ルートでは、次の行を単純に削除できます。

map.connect ':controller/:action/:id.:format'

また、「.xyz」はルーティングされなくなり、404 エラーが発生します。

于 2009-11-04T01:08:52.190 に答える
10

Rails Per-Action Overwrite機能を使用できます。これは何ですか?--> そのアクションに対してオーバーライドするフォーマットを指定して、respond_with にブロックを渡すことで、標準のリソース処理をオーバーライドすることもできます。

class UsersController < ApplicationController::Base

  respond_to :html, :xml, :json

  # Override html format since we want to redirect to a different page,
  # not just serve back the new resource
  def create
    @user = User.create(params[:user])
    respond_with(@user) do |format|
      format.html { redirect_to users_path }
    end
  end
end

:except および :only オプション

:except および :only オプションを渡して、特定のアクションのフォーマットのみをサポートすることもできます (before_filter で行うように)。

class UsersController < ApplicationController::Base
  respond_to :html, :only => :index
  respond_to :xml, :json, :except => :show
  ...
end

:any フォーマット

個々のアクション内でまだ Respond_to を使用したい場合は、未指定のフォーマットに対するワイルドカード マッチとして使用できる :any リソース フォーマットを使用します。

class UsersController < ApplicationController::Base

  def index

    @users = User.all

    respond_to do |format|
      format.html
      format.any(:xml, :json) { render request.format.to_sym => @users }
    end
  end
end
于 2010-03-18T13:43:36.213 に答える
7

Responds_to を使用したくない場合は、次のようにすることができます。

class ApplicationController < ActionController::Base
  before_filter :allow_only_html_requests

  ...

  def allow_only_html_requests
    if params[:format] && params[:format] != "html"
      render :file => "#{RAILS_ROOT}/public/404.html"
    end
  end

  ...

end

これはすべてのリクエストの前に実行され、形式をまったく指定しないか、html 形式を指定するもののみを通過させます。それ以外はすべて 404 になります。受け入れられない 406 を返したい場合は、public/406.html を作成できます。

于 2009-11-04T01:13:32.517 に答える
5

ベンのソリューションは機能します。

ただし、responds_to ソリューションを検討してください。JavaScript json または xml 呼び出しのアクションを開くことが必然的に必要になる場合に柔軟性が得られるため、よりクリーンです。それなら追加しなくていい

skip_before_filter :allow_only_html_requests, :only => [:show]

個人的には、respond_to ブロックが気に入っています。それは非常に説明的です。

respond_to do |wants|
  wants.html
 end

ブロックで指定されていない形式があると、自動的に HTTP 406 Not Acceptable が返されます。それはすばらしい。

于 2009-11-04T21:30:40.177 に答える