0

我正在尝试将我拥有的几个 text_fields 中的一些字符串存储到一个数组中,然后将其保存到数据库中。我有一个名为“opening_hours”的列,我尝试使用如下虚拟属性将其分成 2 个不同的属性:

模型

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 ,要么根本没有保存任何东西。

4

2 回答 2

0

您的解决方案将不起作用,因为您放置了三个文本字段,每个字段都指向同一个字段。Rails 将只取最后一个值。

Rails 将使用输入字段的名称来构造您在服务器上收到的参数散列。由于字段具有相同的名称,因此将只保留一个值。

解决方案非常简单:使用相同的 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_timeandstart_time不是一个数组,所以我不得不稍微伪造它,所以我使用 manual text_field, 用作对象名称venue,这样它将与您场地的其余参数分组。然后我建立名称,因此 rails 将使用输入的值组成一个散列。请注意,您必须明确定义一个值,否则这将不起作用。

然后,在控制器中,您将不得不添加一些代码

  • 编辑时,将数组字符串转换为表单中的值
  • 保存时,将接收到的哈希转换为可以保存的字符串。

注意:如果你不这样做,它将保存序列化的哈希,这可能已经足够了。

于 2013-05-14T13:35:07.673 回答
0

也许我理解错了,但是...

在您的创建操作中,没有 @venue.save - 这可能是您没有看到任何保存的原因。

类场地控制器 < 应用控制器

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

结尾

于 2013-05-14T12:45:10.643 回答