2013-05-14 111 views
0

我試圖從幾個text_fields中存儲一些字符串到數組中,然後將其保存到數據庫中。 我有一個名爲「OPENING_HOURS」至極我試着分成使用虛擬屬性,這樣2個不同的屬性欄:將幾個text_field字符串存儲到數組Rails 3

型號

class Venue < ActiveRecord::Base 
    attr_accessible :opening_hours, :start_time, :end_time 
    attr_writer :start_time, :end_time 

    def start_time 
     @start_time.nil? ? @start_time : opening_hours.to_s.split("-").first 
    end 

    def end_time 
     @end_time.nil? ? @end_time : opening_hours.to_s.split("-").last 
    end 
end 

的想法是,你在START_TIME和END_TIME型像這樣:

查看

<%= form_for @venue do |v| %> 
    <p><%= v.label "Monday" %><%= v.text_field :start_time %>-<%= v.text_field :end_time %><p/> 
    <p><%= v.label "Tuesday" %><%= v.text_field :start_time %>-<%= v.text_field :end_time %><p/> 
    <p><%= v.label "Wednesday" %><%= v.text_field :start_time %>-<%= v.text_field :end_time %><p/> 
<% end %> 

數組應該在DB是這樣的:

{08-12 | 09-14 | 07-13}

用「|」分隔一週的不同日子。

我已經試過幾件事情像控制器:

控制器

class VenuesController < ApplicationController 
    def new 
     @venue = Venue.new 
    end 

    def create 
     @venue = Venue.new(params[:venue]) 
     @total_time = params[:venue][:start_time]+"-"+params[:venue][:end_time] 
     @venue.opening_hours = @total_time.map {|t| [t.start_time, t.end_time]} 
    if @venue.save 
     redirect_to venue_path(@venue), :notice => "Success!" 
    else 
     render 'new' 
    end 
end 

但似乎沒有任何工作......無論它只是START_TIME和END_TIME從保存的最後一天,或沒有任何東西可以保存。

回答

0

也許我可能誤解了,但是......

在你創建的行動,也沒有@ venue.save - 這可能是爲什麼你沒有看到任何東西保存。

類VenuesController < ApplicationController的

def new 
    @venue = Venue.new 
end 

def create 
    @venue = Venue.new(params[:venue]) 
    @total_time = params[:venue][:start_time]+"-"+params[:venue][:end_time] 
    @venue.opening_hours = @total_time.map {|t| [t.start_time, t.end_time]} 
    @venue.save 
end 

+0

我在代碼中有@ venue.save,只是忘了在文章中輸入它。我馬上編輯它。 – Jesper 2013-05-14 12:53:11

0

您的解決方案是行不通的,因爲你把三個文本字段每個指向同一個領域。 Rails將取最後一個值。

Rails將使用輸入字段的名稱來構造您在服務器上接收的參數哈希。由於這些字段具有相同的名稱,因此只會保留一個值。

該解決方案非常簡單:使用相同的導軌標準,我們可以更改輸入字段的名稱,以便導軌將其作爲散列來處理。

<p> 
    <%= v.label "Monday" %> 
    <%= text_field :venue, 'start_time[][monday]', :value => '07' %> 
    <%= text_field :venue, 'end_time[][monday]', :value => '21' %> 
<p/> 
<p> 
    <%= v.label "Tuesday" %> 
    <%= text_field :venue, 'start_time[][tuesday]', :value => '07' %> 
    <%= text_field :venue, 'end_time[][tuesday]', :value => '09' %> 
<p/> 

由於end_timestart_time不是一個數組,我有假了一點,所以我使用手動text_field,使用盡可能所以它會隨着參數的其餘部分進行分組對象的名稱venue您場地。然後我建立這個名字,所以rails會和輸入的值組成一個散列。請注意,您必須明確定義一個值,否則這不起作用。

然後,在控制器,你必須添加一些代碼

  • 編輯時,轉換陣列字符串值的形式
  • 保存時,該recevied哈希轉換爲字符串你可以保存。

注意:如果你不這樣做,它會保存序列化的散列,這可能已經足夠了。