1

私は現在、クライアント側に Ajax/REST を多用する Rails 3 上に構築された Web アプリケーションに取り組んでいます。したがって、私はしばしば次のようなコントローラー アクションを記述しています。

def create
  if !params[:name] 
    respond_to do |format|
      format.html { render json: {}, status: :not_found }
      format.json { render json: {}, status: :not_found }
    end
    return
  end

  account = ...
  respond_to do |format|
    format.html { render json: account }
    format.json { render json: account }
  end
end

私のアクションのほとんどすべてが、成功の場合またはエラー コードで json オブジェクトを返しています。ただし、アクションを早く返したい場合は、常にこの冗長な Respond_to ブロックとリターンを記述する必要があります。

代わりに、代わりにこのようなもの、または同様の代替手段を使用したいと思います:

def create
  if !params[:name] 
    throw :not_found
  end

  account = ...
  return account
end

Rails 3+ でこれを行うにはどうすればよいですか?

4

2 に答える 2

2

彼女はinherited_resourcesを調べてください。これにより、コントローラーを次のように書き直すことができます。

class SomeController < ApplicationController
  inherit_resources
  respond_to :html, :js, :json
end

それだ。すべてのcreate/read / update/deleteメソッドに通常どおりアクセスできます。私が過去に行ったように、inherited_resourcesを使用するマスターリソースコントローラーから継承することができ、その後、より一般的な方法で応答を微調整することができます。

class ResourcesController < ApplicationController
  inherit_resources
  respond_to :html, :js

  def create
    create! do |format|
      format.js do
        # generic code here for managing all create methods initiated via js
        # current model is avialbe via 'resource'
        # e.g 'resource.errors'
      end
    end
  end

次に、そのコントローラーから単純に継承します。

class SomeController < ResourcesController

end

この抽象化は、ほとんどの目的でやり過ぎになる可能性がありますが、すべて同様のコントローラーを必要とする30または40のモデルを操作する場合に非常に便利です。

AliExpress_resourcesは、動的参照を容易にするために現在のモデル(リソースと呼ばれる)にアクセスするための多くのヘルパーを提供します。そのため、たとえば、関連するフォームや、リソース/モデル名に基づいたパーシャルを返すことができます。

これを使用する方法を理解するために、パラメーターでコントローラー名を使用して、現在のコントローラーのフォームを返すことができます。不正な形式のコントローラー名はこのメソッドに到達しないため(404が返されるため)、安全に使用できることに注意してください。

  format.js do
    render "#{params[:controller]}/form"
  end

何よりも、特定のコントローラーでメソッドを定義することにより、自分でメソッドをオーバーライドできます。

于 2012-11-15T11:18:37.293 に答える
1

常に json を返す場合は、respond_toブロックを省略して次のように記述できます。

def create
  if !params[:name] 
    render json: {}, status: :not_found
    return
  end

  account = ...
  render json: account
end
于 2012-11-15T10:59:47.047 に答える