【发布时间】:2012-01-22 09:50:54
【问题描述】:
我有一个 HTML 表单,它使用以下 Sinatra 代码来处理 URL '/add-artist' 的 POST:
post '/add-artist' do
if logged_in?
a = Artist.new
a.name = params[:name]
a.website = params[:website]
a.facebook = params[:facebook]
a.created_by = session[:user_id]
a.created_at = Time.now
a.updated_by = session[:user_id]
a_updated_at = Time.now
a.views = 0
a.save
@user = User.get session[:user_id]
@user.artists.push(a.id)
@user.save
redirect '/'
end
end
正在保存对象“a”,但未保存“@user”。我想更具体地说,'@user.artists' 的值没有被更新。如果您需要更多信息,请询问,但我觉得你们 Ruby 专家会在我提供的代码中发现问题。
更新
这里有一些附加信息。我能够重现 irb 中的错误。首先这是我对“用户”的类定义。
# dm_models.rb
require 'data_mapper'
DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/event_review.db")
class User
include DataMapper::Resource
property :id, Serial
property :email, String
property :password, String
property :user_name, String
property :birthdate, Date
property :city, String
property :state, String
property :zip, String
property :geodata, Object
property :bio, Text
property :friends, Object
property :events, Object
property :event_reviews, Integer
property :artists, Object
property :artist_reviews, Integer
property :venues, Object
property :venue_reviews, Integer
property :created_at, DateTime
property :updated_at, DateTime
property :views, Integer
has n, :reviews
end
这是 irb
>> require 'sinatra'
=> true
>> require 'data_mapper'
=> true
>> require './models/dm_models.rb'
=> true
>> require 'geokit'
=> true
>>
?> include Geokit::Geocoders
=> Object
>> u = User.get 8
=> #<User @id=8 @email="km@km.com" @password="km" @user_name="Katherine Miller" @birthdate=#<Date: 4895485/2,0,2299161> @city="Burbank" @state="CA" @zip="91501" @geodata=#<Geokit::GeoLoc:0x10150d4d8 @street_number=nil, @suggested_bounds=#<Geokit::Bounds:0x10150cf88 @sw=#<Geokit::LatLng:0x10150cd80 @lng=-118.315043, @lat=34.1766949>, @ne=#<Geokit::LatLng:0x10150cee8 @lng=-118.27996, @lat=34.221666>>, @lng=-118.2935891, @zip="91501", @state="CA", @precision="zip", @province=nil, @all=[#<Geokit::GeoLoc:0x10150d4d8 ...>], @street_address=nil, @provider="google", @city="Burbank", @lat=34.2039087, @country_code="US", @full_address="Burbank, CA 91501, USA", @street_name=nil, @accuracy=5, @country="USA", @success=true> @bio=<not loaded> @friends=[] @events=["13", "14", "15", "16", "28", "29"] @event_reviews=7 @artists=[] @artist_reviews=1 @venues=[] @venue_reviews=0 @created_at=#<DateTime: 70729968253/28800,-5/24,2299161> @updated_at=#<DateTime: 1178838019/480,-5/24,2299161> @views=56>
>>
?> u.artists
=> []
>> u.artists.push "5"
=> ["5"]
>> u.save
=> true
>> u = User.get 8
=> #<User @id=8 @email="km@km.com" @password="km" @user_name="Katherine Miller" @birthdate=#<Date: 4895485/2,0,2299161> @city="Burbank" @state="CA" @zip="91501" @geodata=#<Geokit::GeoLoc:0x1014e8638 @street_number=nil, @suggested_bounds=#<Geokit::Bounds:0x1014e80e8 @sw=#<Geokit::LatLng:0x1014e7eb8 @lng=-118.315043, @lat=34.1766949>, @ne=#<Geokit::LatLng:0x1014e8048 @lng=-118.27996, @lat=34.221666>>, @lng=-118.2935891, @zip="91501", @state="CA", @precision="zip", @province=nil, @all=[#<Geokit::GeoLoc:0x1014e8638 ...>], @street_address=nil, @provider="google", @city="Burbank", @lat=34.2039087, @country_code="US", @full_address="Burbank, CA 91501, USA", @street_name=nil, @accuracy=5, @country="USA", @success=true> @bio=<not loaded> @friends=[] @events=["13", "14", "15", "16", "28", "29"] @event_reviews=7 @artists=[] @artist_reviews=1 @venues=[] @venue_reviews=0 @created_at=#<DateTime: 70729968253/28800,-5/24,2299161> @updated_at=#<DateTime: 1178838019/480,-5/24,2299161> @views=56>
>> u.artists
=> []
>> u.artists.class
=> Array
上面代码的描述:我用 id==8 检索用户,将值“5”压入其中。这似乎是成功的。我保存用户#8。然后我重新检索 user#8 并查看艺术家的值,它是一个空数组。
最后,我可以更新“artist_reviews”等其他字段。这是因为我将艺术家、活动和场所的数据类型定义为“对象”吗?所有这些字段都存在这个问题。
感谢您的帮助。
【问题讨论】:
标签: ruby arrays object sinatra datamapper