Tôi biết rằng khi sử dụng mẫu xem (html, rabl), tôi không cần một lời gọi render rõ ràng trong hành động điều khiển của tôi vì theo mặc định, Rails sẽ hiển thị mẫu có tên tương ứng với tên hành động của bộ điều khiển. Tôi thích khái niệm này (không quan tâm đến rendering trong mã điều khiển của tôi) và do đó tự hỏi liệu điều này là có thể cũng như khi sử dụng ActiveModel :: Serializers?ActiveModel :: Serializer có yêu cầu hiển thị cuộc gọi rõ ràng không?
Ví dụ, đây là mã từ một bộ điều khiển tạo (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
và đây là serializer:
class ProductSerializer < ActiveModel::Serializer
attributes :id, :name, :description, :url, :quantity, :price
end
Hitting /products/1.json, tôi sẽ mong đợi hai điều sẽ xảy ra:
- Các trường không được liệt kê trong bộ nối tiếp cần được ommited,
- Toàn bộ đối tượng JSON được lồng vào trong trường cấp cao nhất 'sản phẩm'.
Tuy nhiên, điều này không xảy ra, toàn bộ bộ nối tiếp bị bỏ qua. Nhưng sau đó nếu tôi thay đổi Hiện phương pháp như sau:
# 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
Và bây giờ nó là tất cả tiền phạt, nhưng tôi đã mất đi lợi ích của các bộ lọc before_action (và có vẻ như với tôi rằng tôi có một số mã dư thừa).
Điều này thực sự nên được thực hiện như thế nào?
@zmilojko Bạn đã thử sử dụng ['respond_with'] (http://api.rubyonrails.org/classes/ActionController/MimeResponds.html#method-i-respond_with)? Tôi nghĩ rằng 'respond_with (@product)' sẽ giúp bạn gần gũi nếu không chính xác những gì bạn muốn. [Ví dụ từ 'ActiveModel :: Serializer' README] (https://github.com/rails-api/active_model_serializers#render-json). –
@PaulFioravanti Nhưng đó không phải là những gì tôi theo sau. Tôi muốn 'show' phương pháp để ở lại trống như Rails4 máy phát điện tạo ra nó, nhưng vẫn có thể sử dụng Serializer như được định nghĩa trong câu hỏi (và không jbuilder, như nó iseems Rails sẽ thích). – zmilojko
@zmilojko Đây có phải là ứng dụng Rails 4.1 thẳng không? Hoặc một ứng dụng rails-api? Bạn đang tạo trạng thái ban đầu của ứng dụng như thế nào? – noel