我的应用程序在需要文件的任何控制器或模型上返回并出错。 通常我需要一个如下所示的文件。
require '/lib/position_mover'
我玩了一下它,如果我从下面的服务器的顶级目录中指定路径,它似乎有用。
require '/srv/www/testapp/lib/position_mover'
我想使用相对路径有很多原因。有人可以给我指点吗?
服务器配置:
虚拟主机:
<VirtualHost 173.255.238.220>
ServerName test.targesoft.com
DocumentRoot /srv/www/testapp/public/
<Directory /srv/www/testapp/public/>
PassengerAppRoot /srv/www/testapp/
Allow from all
Options -MultiViews
</Directory>
</VirtualHost>
答案 0 :(得分:1)
如果您需要Rails应用程序的lib
目录中的文件,则没有必要。 Rails默认需要一切。
答案 1 :(得分:1)
您需要将此模块放在lib
目录中,然后将其添加到config.autoload_paths
文件中的config/application.rb
(默认情况下,该设置已被注释掉)。当您在代码中引用此模块时,Rails将自动知道要求lib
目录中的文件。
答案 2 :(得分:0)
感谢您的回复!虽然插件是lib文件夹的实际内容,但我实际上是在我自己的自定义模块中调用。我尝试从模型的顶部取出需要的部分,但除非我需要它作为我的文件的顶部,我得到一个未定义常量的错误。必须有一种方法来设置乘客,以便它默认情况下查看它自己的目录。
module PositionMover
def move_to_position(new_position)
max_position = self.class.where(position_scope).count
# ensure new_position is an integer in 1..max_position
unless new_position.nil?
new_position = [[1, new_position.to_i].max, max_position].min
end
if position == new_position # do nothing
return true
elsif position.nil?
increment_items(new_position, 1000000)
elsif new_position.nil?
decrement_items(position+1, 1000000)
elsif new_position < position
increment_items(new_position, position-1)
elsif new_position > position
decrement_items(position+1, new_position)
end
return update_attribute(:position, new_position)
end
def position_scope
"1=1"
end
def increment_items(first, last)
items = self.class.where(["position >= ? and position <= ? AND #{position_scope}", first, last])
items.each {|i| i.update_attribute(:position, i.position + 1)}
end
def decrement_items(first, last)
items = self.class.where(["position >= ? and position <= ? AND #{position_scope}", first, last])
items.each {|i| i.update_attribute(:position, i.position - 1)}
end
end