【问题标题】:Rails 3 date_select for year onlyRails 3 date_select 仅适用于年份
【发布时间】:2014-01-12 02:57:40
【问题描述】:

我在我的 Rails 3 应用程序中有一个表单,我想在方法 :grad_year 上为一年创建一个 select 标记。我使用date_select 并添加:discard_month:discard_day 让一切正常工作和存储。但是,当我渲染 @profile.grad_year 时,我得到了月份和日期的值。所以我想知道如何@profile.grad_year 存储和渲染年份?

这是表格:

<%= f.date_select :grad_year, {:start_year => Time.now.year, :end_year => Time.now.year - 95, :discard_day => true, :discard_month => true}, :selected => @profile.grad_year %>

在我的迁移中:

t.date :grad_year

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 select


    【解决方案1】:

    Rails 有一个 select_year 助手:

    http://apidock.com/rails/ActionView/Helpers/DateHelper/select_year

    所以你的代码应该是这样的:

    f.select_year(Date.today, :start_year => Time.now.year, :end_year => Time.now.year - 95, :field_name => 'grad_year')
    

    【讨论】:

    • 谢谢,我尝试了类似的方法但出现错误:undefined method select_year for #&lt;ActionView::Helpers::FormBuilder:0x1085b2198&gt;
    • 尝试排除开头的f.
    • 你可以在你的创建动作中设置它:params[:profile][:grad_year] = params[:grad_year]
    • select_year 接受 html_options 哈希作为第三个参数。您可以传入 :name:id 值以匹配表单的其余部分。
    【解决方案2】:

    从@alex_peattie 的回答中综合以上所有内容,我得出以下结论:

    <%= select_year Date.today, :start_year => Time.now.year, :end_year => Time.now.year - 95, :field_name => :grad_year, :prefix => :profile  %>
    

    与 OP 的问题一样,我的案例是在 form_for 块内完成的,因此 f.select_year 抛出了异常。但是,如果您只使用记录在案的 :field_name 选项,则标签将具有 ID date_grad_year 和名称 date[grad_year],这不是 Rails 所期望的。使用(仅记录在 API 的最顶部):prefix 选项将 date 更改为 profile

    所以这比 #@%$^*& html_options 哈希要好,尽管使用 rails 已有 5 年了,但如果不尝试五次,我似乎无法正确 :-)。

    哦,Rails,我多么爱你,但同时也很高兴 Stack Overflow 能够帮助我们大家了解你令人愉快的特质!

    【讨论】:

    • 正是我想要的。谢谢。
    • 一个更通用的解决方案是select_year f.object.field_name ... :prefix =&gt; f.object_name
    【解决方案3】:

    这个 select_year 函数完全搞砸了。

    这终于奏效了:

    <%= form_for(@user) do |f| %>
     <%= select_year current_user.birth_year, { :prompt => "Year", 
                                                :start_year => Time.zone.now.year - 13, 
                                                :end_year => Time.zone.now.year - 80, 
                                                :field_name => :birth_year, 
                                                :prefix => :user }, 
                                                class:"form-control" %>
    <% ... %>
    

    在 Rails 中应该是这样的:

    <%= f.select_year :birth_year, { :prompt => "Year", 
                                                :start_year => Time.zone.now.year - 13, 
                                                :end_year => Time.zone.now.year - 80}, 
                                                class:"form-control" %>
    

    【讨论】:

    • 说真的……这到底是什么 RoR……sigh
    猜你喜欢
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多