2011-05-18 162 views
0

我正在使用rails 3應用程序。 我有一個問題。我將如何將數據保存到我的數據庫中?我想使用日期時間數據類型將簽入和簽出會話保存到數據庫。如何將數據從會話保存到數據庫?

控制器:

def step2 
    @cart = current_cart 

    checkin = params[:checkin] 
    checkout = params[:checkout] 
    @amenities = Amenity.available(checkin, checkout) 

    session[:checkin] = checkin 
    session[:checkout] = checkout 
end 

觀點:

<%= f.hidden_field :Transaction_Date, :value => Time.now %> 
    <%= f.hidden_field :rsv_type, :value => "Online" %> 
    <%= f.hidden_field :rsv_status, :value => "Pending" %> 
    <%= f.hidden_field :checkin, session[:checkin] %> 
    <%= f.hidden_field :checkout, session[:checkout] %> 
<% end %> 

即時得到這個錯誤:

NoMethodError 
undefined method `merge' for "05/18/2011":String 

幫助..請。謝謝。

從我的ApplicationController:

private 

def current_cart 
    Cart.find(session[:cart_id]) 
rescue ActiveRecord::RecordNotFound 
    cart = Cart.create 
    session[:cart_id] = cart.id 
    cart 
end 

,當我把這些代碼:

@cart.checkin = DateTime.strptime(session[:checkin], "%m/d/%Y %I:%M:%S %p").to_time 
@cart.checkout= DateTime.strptime(session[:checkout], "%m/d/%Y %I:%M:%S %p").to_time 
@cart.save 

我得到引發ArgumentError無效日期的錯誤。 ?:(我應該怎麼辦使用SQL Server 2005爲我的數據庫IM

這裏是我的車模型

級車<的ActiveRecord :: Base的 的has_many:line_items,:依賴=>:摧毀

def add_amenity(amenity_id) 
    current_item = line_items.where(:amenity_id => amenity_id).first 
    if current_item 
     return false 
    else    
     current_item = LineItem.new(:amenity_id => amenity_id) 
     line_items << current_item 
    end 
    current_item 
end 

def total_price 
    line_items.to_a.sum { |item| item.amenity.fee } 
end 

def payable 
    total_price * 0.50 
end 
end 

回答

2

你並不需要在您的形式(在你的榜樣最後兩個hidden_​​fields)傳遞會話數據。一般情況下,節省您的會話數據是非常簡單的。

# some controller action with @cart defined 
@cart.checkin = session[:checkin] 
@cart.checkout = session[:checkout] 
@cart.save 

確保在此會話數據中包含任何必要的驗證,以保護您的系統並確保保存到數據庫的數據質量高。

此外,會話數據不應該被信任的關​​鍵信息,絕對不使用它來存儲密碼,關係到你的購物車的財務數據等


關於的日期部分你的問題,這是如何將字符串日期轉換爲實際的日期/時間。

DateTime.strptime("2011/05/18 13:42:02", "%Y/%m/%d %H:%M:%S").to_time 
+0

即時通訊獲得另一個錯誤。 NoMethodError未定義的方法'checkin ='for# Crisgine 2011-05-18 01:29:16

+0

@Crisgine - 你必須正確定義'@ cart',比如'@cart = Cart.where(「id =?」,params [:id]) .first'。當然,這裏假設你的'Cart'模型有一個'checkin'字段。 – sscirrus 2011-05-18 04:18:35

+0

@Crisgine - 背景位 - 如果你只是做了@cart = Cart.where(「id =?」,params [:id])',你會得到一個關係,而不是一條記錄。即使關係只包含一條記錄,您也必須添加'first'來獲取可以開始更改屬性的內容。 – sscirrus 2011-05-18 05:07:40