在日历中创建Rails表单,收集日期属性以提交表单

时间:2014-02-22 05:11:59

标签: ruby-on-rails ruby forms calendar nested-forms

我是Rails的新手,我遇到了一些麻烦,我认为我的问题与这个问题类似,但在那里没有得到解决(并且似乎不是使用hidden_​​field的最佳做法): Turning a calendar into a form using Rails?

我想建立一个日历,在这个日历中,有人通过在他们旅行的特定日期输入里程来跟踪自行车里程。

我正在使用https://github.com/watu/table_builder来构建我的日历,它看起来像这样:

index.html.erb

<%= calendar_for(@miles, :year => @date.year, :month => @date.month) do |t| %>
    <%= t.head('mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun') %>
    <%= t.day(:day_method => :day_logged) do |day, miles| %>
        <%= day.day %>
        <%= render 'form', :day => day %>
            <% miles.each do |mile| %>
                <h3><%= h(mile.distance) %></h3>
            <% end %>
    <% end %>
<% end %>

_form.html.erb

<%= form_for @mile, url: {action: "create"}, html: {class:"mile_form"} do |f| %>
<%= f.hidden_field :day_logged, day %>
<p>
    <%= f.label :distance, "Miles ridden" %>
    <%= f.number_field :distance %>
    <%= f.submit "Add" %>
</p>

trips_controller.rb

def index
    @mile = Mile.new
    @miles = Mile.find(:all)
    @date = params[:month] ? Date.parse("#{params[:month]}-01") : Date.today
end

def create
    @mile = Mile.new(params[:distance])
    if @mile.save
        redirect_to root_path
            else
                    ## ???
    end
end

mile.rb

validates :distance, presence: true, :numericality => {:only_integer => true}
validates :day_logged, presence: true

schema.rb

create_table "miles", force: true do |t|
  t.integer  "distance"
  t.date     "day_logged"
  t.datetime "created_at"
  t.datetime "updated_at"
end

我尝试过隐藏字段选项并收到此错误:

NoMethodError in Trips#index   
undefined method `merge' for Sun, 26 Jan 2014:Date

我对此非常感到困惑,我认为无论如何这都是最好的方式。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

hidden_​​field方法的第二个参数是选项的哈希值,而不是值。所以不要这样:

<%= f.hidden_field :day_logged, day %>

这样做:

<%= f.hidden_field :day_logged, value: day %>
顺便说一下,在你的职业生涯中,你可能会犯同样的错误大约32,000次。