2

Rails モデルで ActiveResource を使用して基本的な CRUD 操作を実装しようとしています。ドキュメントには、のサブクラスを作成してからActiveResource::Base設定するように記載されていself.siteます。

これは、フェッチされた既存のレコードを更新しようとするまでうまく機能します。表示されるエラーは ' ' です。これは、およびフィールドにアクセスできないため、ActiveResource オブジェクトでメソッドMassAssignmentSecurity::Errorを呼び出したときに表示されます。'save()'created_atupdated_at

モデルクラスでこれらのフィールドをマークすると問題なく動作することがわかりましattr_accessibleたが、それは非常に安全ではなく、かなり貧弱なソリューションのようです。
以下に、問題の例を示します。

rails new TestApp
cd TestApp
rails generate scaffold User first:string last:string
rake db:create
rake db:migrate
rails server

私が使用する別の端末タブで:

irb
require 'active_resource'
class User < ActiveResource::Base
self.site = 'http://localhost:3000'
end
u = User.new()
u.first = 'John'
u.last = 'Shine'
u.save()
#This saves ok
nu = User.find(1)
nu.first = 'Geoff'
nu.save() 
#This never works

これに対するより良い解決策はありますか?

4

1 に答える 1

1

Assuming you want to discard the Timestamp fields and have rails create them automatically (as normal) I would get the data from a new json/xml template inside the app which doe not include the Timestamp fields.

Also assuming you have access to the app which is providing the data you could add something like the below to your rails model to test, it overrides (could call it 'uses') the as_json method for the json template.

def as_json(options = {})
  super(:except => [:created_at, :updated_at])
end

This will update the timestamp fileds by the rails server itself.

Alternatively you should have a look at RABL and jbuilder as both are great options.

于 2013-02-11T13:09:54.967 に答える