我有absense.html.erb
,在开发和制作方面效果很好。但是,当我尝试访问该页面时,我收到以下错误:
2013-03-25T18:43:43 + 00:00 app [web.1]:开始获取“/缺席” 77.100.90.77 at 2013-03-25 18:43:43 +0000 2013-03-25T18:43:43 + 00:00 app [web.1]:2013-03-25T18:43:43 + 00:00 app [web.1]: ActiveRecord :: StatementInvalid(PG ::错误:错误:列“已请求” 不存在2013-03-25T18:43:43 + 00:00 app [web.1]:LINE 1:... LECT “假期”。*来自“假期”WHERE(州=“请求... 2013-03-25T18:43:43 + 00:00 app [web.1]:
^ 2013-03-25T18:43:43 + 00:00 app [web.1] :: SELECT“holidays”。* FROM “假期”WHERE(州=“请求”)):2013-03-25T18:43:43 + 00:00 app [web.1]:2013-03-25T18:43:43 + 00:00 app [web.1]: 2013-03-25T18:43:43 + 00:00 app [web.1]:
app / controllers / holidays_controller.rb:52:在'缺席' 2013-03-25T18:43:43 + 00:00 heroku [router]:at = info method = GET path = / rota_days host = miuk-portal.herokuapp.com fwd =“77.100.90.77” dyno = web.1 queue = 0 wait = 0ms connect = 1ms service = 5773ms status = 200 字节= 897173
错误指向我的控制器中的absense方法的以下行
def absence
#show the holidays where the approver id matches the current user id
#and state = "requested"'
@user = current_user
if current_user.role? :administrator
# a superadmin can view all current holiday requests
@holidays = Holiday.find(:all, :conditions => 'state = "requested"')
else
#otherwise an admin sees the holiday requests that they are approvers for
@holidays = Holiday.find(:all, :conditions => ["approver_id = #{current_user.id}", "state = requested"])
end
end
我已在假日模型中声明了这一点,如下所示:
Holiday.rb
class Holiday < ActiveRecord::Base
belongs_to :user
belongs_to :calendar
belongs_to :type, :class_name => "Type"
belongs_to :approver, :class_name => "User"
before_create :default_values #Before creating holiday set default_values
#before_create :overflow
validates :start_at, :presence => { :message => "must be a valid date/time" }
validates :end_at, :presence => {:message => "must be a valid date/time"}
validate :start_must_be_before_end_date
validate :overflow #Hook method to determine if user holidays are over the set amount
validates_presence_of :end_at, :start_at
attr_accessible :description, :end_at, :start_at, :state, :type_id, :user_id, :color
def length
(self.end_at.to_i - self.start_at.to_i)/(60*60*24)
end
def days_used
( (start_at.to_date)..(end_at.to_date) ).select {|d| (1..5).include?(d.wday) }.size
end
#Validates_presence_of is called to ensure that the start date exisit.
#Start date must be lt or = to end date otherwise throw error.
def start_must_be_before_end_date
errors.add(:start_at, "must be before end date") unless
self.start_at <= self.end_at
end
#Overflow of holidays is validated by calling "validates" L31. Then checks if absent days
#Is gt or = to length
def overflow
errors.add(:overflow, "- You only have #{user.absentdays} days holiday remaining; this absence is #{length} days.") unless
user.absentdays >= length
end
def name
return self.user.name
end
def colors
if state ||= "denied"
return self.color ||= "#C00000"
end
end
private
#Setting default values - before_create is called and sets the following
def default_values
self.state ||= "requested"
self.color ||= "#000000"
self.type_id||= 1
end
end
似乎不明白为什么它在开发和生产中都有效,而不是在heroku中。有什么想法吗?
答案 0 :(得分:2)
标准SQL字符串使用单引号,双引号用于标识符(例如表名和列名); PostgreSQL遵循这里的标准,MySQL和SQLite不那么严格,其他数据库做不同严格程度的其他事情。在任何情况下,SQL字符串文字的单引号应该在任何地方都一样。
您在SQL字符串上使用双引号:
@holidays = Holiday.find(:all, :conditions => 'state = "requested"')
#------------------------------------------------------^---------^
你必须单引号:
@holidays = Holiday.find(:all, :conditions => %q{state = 'requested'})
或将其现代化并让ActiveRecord处理引用:
@holidays = Holiday.where(:state => 'requested')
你可能也需要修改这个引用:
@holidays = Holiday.find(:all, :conditions => ["approver_id = #{current_user.id}", "state = requested"])
同样,现代化是最简单的方法:
@holidays = Holiday.where(:approver_id => current_user.id, :state => 'requested')
我猜你在SQLite上开发但在PostgreSQL上部署。这是个坏主意,总是在同一个堆栈上开发和部署。