如何创建提交两个日期并输出报告的表单?

时间:2010-08-13 05:15:31

标签: ruby-on-rails forms date controller

我目前有一个生成报告的控制器。这是控制器:

def last5days

    #@monday = (Time.now).at_beginning_of_week

    @monday = (Time.now).months_ago(1)
    #@friday = 5.days.since(@monday)-1.second
    @friday = (Time.now)
    @sent_emails = ContactEmail.all(:conditions => ['date_sent >= ? and date_sent <= ?', @monday, @friday])

    @made_calls = ContactCall.all(:conditions => ['date_sent >= ? and date_sent <= ?', @monday, @friday])

    @letters_sent = ContactLetter.all(:conditions => ['date_sent >= ? and date_sent <= ?', @monday, @friday])

    @contacts_added = Contact.all(:conditions => ['date_entered >= ? and date_entered <= ?', @monday, @friday])

    #@table = ContactEmail.report_table(:all,
     #                                   :conditions => ['date_sent >= ? and date_sent <= ?', @monday, @friday])

    #@grouping = Grouping(@table, :by => "email_id")                                    

  end

我希望有一个界面,人们可以选择开始日期和结束日期,点击提交,然后返回输出。

而不是硬编码mondayfriday

我很难找到一个例子或确切知道该怎么做。

我从一个新观点开始:

<%= render :partial => 'form' %>


<div id = 'display'>

</div>

我希望控制器的输出通过Ajax显示在“display”中。

我尝试按如下方式创建表单:

<% remote_form_for  do |f| %>

  <p>
    <%= f.label :start_date %><br />
    <%= f.date_select_tag :start_date %>
  </p>
  <p>
    <%= f.label :end_date %><br />
    <%= f.date_select_tag :end_date %>
  </p>
  <p><%= f.submit "Submit" %></p>


 <% end %>

然后我的计划是将控制器更改为接受params[:start_date]params[:end_date]

但我不认为我完全知道这些作品是如何结合在一起的。指导?帮助

以下是我现在正在尝试的内容:

查看:find_start_end.html.erg

<% form_tag('return_search') do %>
  <p>
    <label>Start Date</label> <%= date_select('start_date', 'params') %>|
     <label>End Date</label> <%= date_select :end_date, params[:end_date] %>
  </p>
  <p><%= submit_tag "Get Stats" %></p>
<% end %>

控制器:

def return_search

    @sent_emails = ContactEmail.all(:conditions => ['date_sent >= ? and date_sent <= ?', params[:start_date], params[:end_date]])

    @made_calls = ContactCall.all(:conditions => ['date_sent >= ? and date_sent <= ?', params[:start_date], params[:end_date]])

    @letters_sent = ContactLetter.all(:conditions => ['date_sent >= ? and date_sent <= ?', params[:start_date], params[:end_date]])

    @contacts_added = Contact.all(:conditions => ['date_entered >= ? and date_entered <= ?', params[:start_date], params[:end_date]])

    respond_to do |format|

      format.html #view needs to be the same name as the method

    end 

    def find_start_end

    end

1 个答案:

答案 0 :(得分:1)

1)确保首先获得基本的HTML版本 2)然后将其转移到Ajax。

这个流程让所有人都参与其中并保持逻辑有序。

你的所有逻辑都是正确的,所以我只会给你HTML版本的代码,一旦你搞定了,你可以得到远程版本。

控制器:

 def index
       @start_date = Date.strptime(params[:start_date],"%d/%m/%Y")
       @end_date = Date.strptime(params[:end_date],"%d/%m/%Y")
       @stuffs = Stuff.find(:all, :conditions => ["created_at > ? and updated_at < ?",@start_date, @end_date])
      responds_to do |format|
          format.html #view needs to be the same name as the method
      end 
 end 

视图

<% form_tag(stuffs_path, :method => :get) do %>
  <p>
    <label>Start Date</label> <%= datetime_select :start_date, params[:start_date] %> |
     <label>End Date</label> <%= datetime_select :end_date, params[:end_date] %>
  </p>
  <p><%= submit_tag "Get Stats", :disable_with => "Getting stats..." %></p>
<% end %>

的routes.rb

你需要像这样的顶部一行:

map.resources :stuffs

基本上这是创建特定路线。 现在,您可以调用stuffs_path,它将转到索引操作。

如果您不使用REST,则search_stuff_path可以是:controller =&gt; :your_controller =&gt; :action =&gt; your_action。如果您使用REST,则需要将其作为成员添加到您的routes.rb中。如果您需要更多信息,请告诉我们。

顺便说一句 - 我使用的东西是你资源的通用术语。我想你想要的是报告所以控制器,路由和视图分别是reports_path和map.resources:reports。

所以现在你已经获得了HTML版本,很容易远程进行。

控制器

def index
    responds_to do |format|
        format.js render :partial => "remote_report"
        # you can use RJS or a partial. 
        # If it's one place you want to update just use a partial.
        # Create a file _remote_report.html.erb as a partial.
        # Put this in the views folder of course
    end 
end 

在您看来:

 <div id="div_id_to_update">
 <% remote_form_tag(stuffs_path, :method => :get, :update => "div_id_to_update") do %>
   <p>
     your form methods here
   </p>
   <p>your submit tag here</p>
 <% end %>
 </div>

这些是您需要更改以使其基于远程的部分。