使用select,赋值变量和检索记录

时间:2014-04-18 16:33:57

标签: ruby-on-rails-3 date

我正在尝试我认为很简单的事情,但我找不到类似的解决方案并且很容易适应我的问题。

我有一个带有选择下拉列表的视图,该下拉列表仅包含月份(1月至12月)。我希望用户能够选择一个月并单击link_to按钮并检索记录的子集,其中billDate字段包含相关月份,我不关心当天,记录将始终是当年。

我使用了以下内容......

...模型

class Bentry < ActiveRecord::Base

attr_accessible :billDate, :timeBilled, :expenseBilled, :client_id, :paid, :billTotal, :pmtTotal, :cPmtTotal, :tPmtTotal 

belongs_to :client

...查看w / select ...

<p>
<%= form_tag("/bentries#monthlysumm", method: "get") do %>
<% @months = [{"month" => "January", "id" => "1"}, {"month" => "February", "id" => "2"}, {"month" => "March", "id" => "3"}, {"month" => "April", "id" => "4"}, {"month" => "May", "id" => "5"}, {"month" => "June", "id" => "6"}, {"month" => "July", "id" => "7"}, {"month" => "August", "id" => "8"}, {"month" => "September", "id" => "9"}, {"month" => "October", "id" => "10"}, {"month" => "November", "id" => "11"}, {"month" => "December", "id" => "12"} ] %>

<%= rpt_month = select_tag( 'months', options_for_select(@months.collect {|p| [ p['month'], p['id'] ] }) ) %>

<%= link_to "<button>Get Report</button>".html_safe, bentries_path(:billDate => rpt_month) %>

<% end %>

......和,控制器......

def monthlysumm
   @bentries = Bentry.joins(:client).where("billDate = ?", params[:rpt_month])
end

之前从未这样做过,我不明白如何从传递给GET调用的select中获取值。它似乎传递了几个月和ID的整个哈希。其次,我在控制器中正确进行查询吗?我只关心在billDate字段中查看完整日期(非日期时间)的月份,并检索所选月份中的所有日期。

当涉及到RoR时,我非常环保,所以如果你需要任何进一步的信息,请问,但要具体......假设我什么都不知道! ; )

编辑* * 在Nitish的帮助下,我得到了固定的选择,我现在将月份变量传递给我的控制器。并且,还有来自Nitish的一只手,我试图将编辑应用于他引用的另一个答案中引用的控制器,该答案仅基于日期字段的月份部分进行查询。但是,我仍然没有返回任何记录,我知道我的条目是&#34; billDate&#34;包含我选择的月份。

编辑* * 应用程序的新编辑控制器...

# GET /bentries/january
def monthlysumm
   @bentries = Bentry.by_month(params[:billDate])    
end

这里是模型的补充...

def self.by_month(mon)
   where("strftime('%m', billDate) + 0 = ?", mon)
end

这会生成一个像这样的SQL语句......

SELECT "bentries".* FROM "bentries" WHERE (strftime('%m", billDate) + 0 = '2')

如果我在Firefox中使用SQLite Manager并键入(等效的)SQL语句...

SELECT * FROM bentries WHERE (strftime('%m', billDate) + 0 = 2)

它从&#34; bentries&#34;返回预期的3条记录。表,但是应用程序中的代码生成NO结果记录集。

任何人都可以看到我在控制器或模型中出错了吗?!?

1 个答案:

答案 0 :(得分:0)

视图中的Rails代码在呈现视图时执行。所以rpt_month包含select_tag返回的值(不是用户选择的值)。要获取用户选择的值,您必须使用客户端脚本。

如果我正确理解您的问题,则不需要 link_to 。你可以这样做:

<%= form_tag(bentries_path, method: "get") do %>
  <%= select_tag(:billDate, options_for_select((1..12).map{|m| [Date::MONTHNAMES[m], m] }) ) %>
  <%= button_tag "Get Report" %>
<% end %>

在控制器中,您必须修改查询以仅考虑日期字段的月份部分。在接受的答案this问题中对此进行了很好的解释: