모바일 앱에 대해서만 웹 서비스 역할을하는 Rails 앱을 작성 중입니다. --api
및 --skip-active-record
스위치를 사용하여 만들었습니다 . 내 모델에는 DateTime 필드가 있습니다.
다음은 내 모델에 대한 코드와 컨트롤러에서 호출 한 메서드입니다. 을 사용하고 있기 때문에 --api
보기 코드가 없습니다.
class GroceryItem
include Mongoid::Document
field :name, type: String
field :expiry, type: Date
end
# grocery_items_controller.rb
# GET /grocery_items/1
def show
render json: @grocery_item
end
데이터베이스에서 해당 필드의 시간 구성 요소가 저장되고 있음을 알 수 있습니다.
db.grocery_items.find()
{ "_id" : ObjectId("58a9298da1c1d12e7cee02d9"), "name" : "Chocolate", "expiry" : ISODate("2017-02-19T05:13:49.253Z") }
Rails 콘솔에서도 볼 수 있습니다.
irb(main):003:0> GroceryItem.first
=> #<GroceryItem _id: 58a9298da1c1d12e7cee02d9, name: "Chocolate", expiry: 2017-02-19 05:13:49 UTC>
그러나 GroceryItem 모델 클래스의 메서드를 사용하여 만료에 액세스하려고하면 Date 개체가 나타납니다. 시간 부분이 아닌 데이터의 날짜 부분 만 얻습니다.
irb(main):004:0> GroceryItem.first.expiry
=> Sun, 19 Feb 2017
irb(main):005:0> GroceryItem.first.expiry.class
=> Date
irb(main):006:0> GroceryItem.first.expiry.to_s
=> "2017-02-19"
인스턴스에서 to_json
및 호출 as_json
도 데이터를 생략합니다.
irb(main):008:0> GroceryItem.first.to_json
=> "{\"_id\":{\"$oid\":\"58a9298da1c1d12e7cee02d9\"},\"expiry\":\"2017-02-19\",\"name\":\"Chocolate\"}"
irb(main):009:0> GroceryItem.first.as_json
=> {"_id"=>BSON::ObjectId('58a9298da1c1d12e7cee02d9'), "expiry"=>Sun, 19 Feb 2017, "name"=>"Chocolate"}
내 JSON 응답으로 데이터가 생략됩니다. 컨트롤러의 렌더링 프로세스가 to_json
또는 as_json
렌더링을 사용한다고 가정합니다 .
{
"_id": {
"$oid": "58a9298da1c1d12e7cee02d9"
},
"expiry": "2017-02-19",
"name": "Chocolate"
}
마침내 다음을 호출하여이 데이터에 액세스하는 방법을 알아낼 수있었습니다. 마침내 Time Ruby 클래스를 얻는 방법을 볼 수 있습니다.
irb(main):010:0> GroceryItem.first.attributes[:expiry]
=> 2017-02-19 05:13:49 UTC
irb(main):011:0> GroceryItem.first.attributes[:expiry].class
=> Time
이를 통해 마침내 MongoDB에 저장된 데이터와 일치하도록 ISO8601 사양과 호환되는 방식으로 데이터를 직렬화 할 수 있습니다.
irb(main):012:0> GroceryItem.first.attributes[:expiry].utc.iso8601
=> "2017-02-19T05:13:49Z"
확실히이 동작은 올바르지 않습니다. 개발자가 필드에 대해 DataTime 유형을 선택할 때 시간 구성 요소가 전달되기를 원해야합니다. 그렇지 않으면 대신 날짜 유형을 사용합니다. 이제 내가 적합하다고 생각하는 방식으로 JSON을 렌더링하는 뷰를 생성하여 기본 Rails API 및 Mongoid 페어링 동작을 재정의 할 수 있다는 것을 이해했지만 기본 동작을 자동으로 변경해야한다고 생각하기 때문에 버그 보고서 제출을 고려하고있었습니다. 개발자가 DateTime 필드 유형을 선택할 때 데이터베이스에 저장된 모든 데이터를 렌더링합니다.
버그 보고서 제출을 진행하기 전에 여기에있는 누군가가이 문제에 대한 의견이 있는지 궁금합니다.
코드에 문제가있는 것 같습니다.
class GroceryItem
include Mongoid::Document
field :name, type: String
field :expiry, type: Date
end
여기서 expiry는 Date 유형을 가지 므로 시간 구성 요소없이 Date를 반환 할 것으로 예상됩니다. 적절한 유형을 사용하면 문제가 해결 될 것이라고 생각합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다