Ajax调用rails返回Missing模板

时间:2014-06-26 15:19:02

标签: javascript jquery ruby-on-rails ruby ajax

我正在尝试向数据库发出查询,以便每次用户在jquery ui datepicker中更改月份时获取该月的可用日期。当他们选择当天时,它会向DB查询当天可用的小时数。

  1. 我应该这样做吗?我应该每年更换一次吗?这会是太多的记录吗? (我觉得如果我要发送一年中哪些时间可用,我会觉得。)

  2. 如何正确执行此操作?当我进行Ajax调用时,我得到“找不到模板。”

  3. 相关代码:

    tasks_controller.rb

    def new
      if signed_in?
        @task = Task.new
        get_dates
      else
        redirect_to root_path
      end
    end
    
    def get_dates(day=nil)
    
        if !day
          day = DateTime.now
        end
        day = day.utc.midnight
    
        minus_one_month = (day - 1.month).to_time.to_i
        plus_one_month = (day + 1.month).to_time.to_i
    
        full_days_results = AvailableDates.all.select(['unix_day, count(*) as hour_count']).group('unix_day').having('hour_count > 23').where(unix_day: (minus_one_month..plus_one_month))
    
        full_days_arr = full_days_results.flatten
    
        full_unix_array = []
    
        full_days_arr.each do |full_day|
          tmp_date = Time.at(full_day.unix_day).strftime('%m-%d-%Y')
          full_unix_array.append(tmp_date)
        end
    
        gon.full_days = full_unix_array
    
        return 
    end
    

    tasks.js.coffee

    full_days = gon.full_days if gon
    $ ->
      $('.datepicker').datepicker(
        dateFormat: 'mm-dd-yy'
        beforeShowDay: available
        onChangeMonthYear: (year, month, inst) ->
          target = "#{month}-01-#{year}"
          jqxhr = $.get("/getdates",
            day: target
          )
          console.log(jqxhr)
          $(this).val target
          return
    

    任务\ new.html.erb

    <%= f.label :end_time %>
    <%= f.text_field :end_time, :class => 'datepicker' %>
    

    的routes.rb

    ...
    match '/getdates',to: 'tasks#get_dates',      via: 'get'
    

    错误

    Template is missing
    
    Missing template tasks/get_dates, application/get_dates with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee]}. Searched in: * "c:/dev/rails_projects/onager-web-app/app/views"
    

1 个答案:

答案 0 :(得分:1)

嗯,你需要做的几件事情:

1 - 将get_dates设为私有(并选择更像红宝石的名称)

private

def hours_for(day=nil) 
...
end

Rails认为get_dates是一个控制器动作,当它真的没有时。这就是为什么它找不到get_dates动作的相应视图的原因(当它不是动作时,它是一个辅助方法,也许你应该考虑把它放在一个模型中)

2 - hour_for方法应该返回一些东西。现在不是。我不知道这行是做什么的:

gon.full_days = full_unix_array

我的意思是,gon是什么?只需直接返回数组即可。你不应该在get方法中设置东西。另外,请查看this以了解如何在rails页面中呈现json。

3 - 将您的 tasks.rb 重命名为rails项目的controllers文件夹中的 tasks_controller.rb

4 - 将routes.rb文件修复为:

get '/getdates/:day', to: 'tasks#load_dates', as: 'getdates'

此外,必须在 load_dates 调用 hours_for 。任务中的“新”操作应该呈现模板,每次用户更新日期时,您的coffeescript都应该调用load_dates ajax方法。

现在,您需要了解如何更新new.html.erb页面。