5

ビュー テンプレート (html、rabl) を使用する場合、Rails は既定で、コントローラー アクション名に対応する名前でテンプレートをレンダリングするため、コントローラー アクションで明示的なレンダリング呼び出しが必要ないことを知っています。私はこのコンセプトが気に入っています (私のコントローラー コードでのレンダリングは気にしません)。

例、これは生成されたコントローラーのコードです (Rails 4.1.0):

class ProductsController < ApplicationController
  before_action :set_product, only: [:show, :edit, :update, :destroy]

  #other actions
  # GET /products/1
  # GET /products/1.json
  def show
  end
end

そしてこれはシリアライザーです:

class ProductSerializer < ActiveModel::Serializer
  attributes :id, :name, :description, :url, :quantity, :price
end

/products/1.json にアクセスすると、次の 2 つのことが起こると予想されます。

  1. 省略されるシリアライザーにリストされていないフィールド、
  2. 「製品」の最上位フィールド内にカプセル化される JSON オブジェクト全体。

ただし、これは発生せず、シリアライザー全体が無視されます。ただし、Show メソッドを次のように変更すると、次のようになります。

# GET /products/1
# GET /products/1.json
def show
  @product = Product.find(params[:id])
  respond_to do |format|
    format.html
    format.json { render json: @product }
  end
end

そして今はすべて問題ありませんが、 before_action フィルターの利点を失いました (そして、冗長なコードがあるように思えます)。

これは実際にどのように行うべきですか?

4

2 に答える 2

0

2 番目のコードに見られる「冗長コード」は、次の行のみです。

@product = Product.find(params[:id])

そして、これは before_action と同じロジックだと思います。この行は必要ありません。削除するだけです。これで重複が削除されました。

残りの部分へ。アクションは何をレンダリングするかを知る必要があります。デフォルトでは、アクションが空または存在しない場合、対応する 'action_name'.html.erb (および で指定された他の形式respond_to) が検索され、レンダリングされます。

これが、Rails 4 ジェネレーターが作成したものが機能する理由です。レンダリングされるshow.html.erbとを作成します。show.json.jbuilder

ではActiveModel::Serializer、テンプレートはありません。アクションを空のままにしておくと、何をレンダリングするかがわかりません。@productしたがって、次のいずれかによって、json としてレンダリングするように指示する必要があります。

render json: @product

また

respond_with @product

于 2014-04-25T01:42:17.207 に答える