我正在尝试将一些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,要么根本没有保存。
答案 0 :(得分:0)
我或许可能误解了,但是......
在你的创建动作中,没有@ venue.save - 这可能就是你没有看到任何保存的原因。
类VenuesController&lt; 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
端
答案 1 :(得分: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_time
和start_time
不是数组,我不得不假装它,所以我使用手册text_field
,用作对象名venue
所以它将与您的场地的其余参数分组。然后我构建了名称,因此rails将使用输入的值组成一个哈希。注意,您必须明确定义一个值,否则这将不起作用。
然后,在控制器中,您必须添加一些代码
注意:如果不这样做,它将保存序列化哈希,这可能已经足够了。