小编Kul*_*gar的帖子

Ruby On Rails 3.1 - 资产管道 - 资产呈现两次

大更新:

当我终于找到真正的解决方案时,我也发现了真正的问题.正如我在这里写下了许多无用的信息,考虑到真正的问题,我正在对问题进行大量更新,以便其他人可以轻松找到正在发生的事情,并且可以看到解决方案.

问题:这是因为Rails 3.1的资产管道

实际上......这很简单:资产在开发环境中呈现两次.做了很多调查,我发现我的Rails 3.1服务器正在从"app/assets"和"public/assets"文件夹中渲染资产.所以,我将每个.js和.css文件重复,这打破了我所有的javascript动画(是的...绑定两次相同的事件和处理程序到同一个元素不是你想要的......通常).

如果问题突然出现,那是因为我必须运行"rake assets:precompile"来部署我的应用程序.从那时起,当我的应用程序在开发中运行时,服务器正在呈现静态预编译资产和动态预编译资产.

解决方案(现在有一个更好的几行) - 但你仍然可以阅读它

第一个:我只需从公共文件夹中删除所有预编译资产.

更好的一个:将config.serve_static_assets = false添加到development.rb,这将阻止从/ public/assets加载文件.另外,不要忘记重置浏览器缓存.

[编辑:2012年7月20日]

高级一:由于这些静态资产,我最近遇到了一个新问题.您知道,当您使用paperclip或其他一些gem时,他们会将您的图像添加到某个系统子文件夹的公共文件夹中,因为如果您想使用capistrano部署应用程序,那么它会更好.嗯,那太好了,但是!当我们添加config.serve_static_assets = false时,这些图像不会在开发中呈现,如果你想对它们做一些css则这很糟糕.所以!该怎么办?

事实上,你必须像开发一样开启静态资产:

# Expands the lines which load the assets
config.assets.debug = true
config.serve_static_assets = true
Run Code Online (Sandbox Code Playgroud)

然后,为了防止rails将其他资源渲染两次(预编译的资源),只需执行以下命令:

rake assets:clean
Run Code Online (Sandbox Code Playgroud)

它与rake资产相反:precompile并将清理你的public/assets文件夹,这样Rails就不会再渲染你的资产两次了.当然,每次预编译它们时,您仍然需要清理浏览器缓存并清理资产.

[编辑:2013年11月18日] - 来自@idejuan的回答

另一种方案:

你可以添加这一行:

config.assets.prefix = '/dev/assets'

对于development.rb,前缀可以是你想要的任何东西.脚本将不再加载两次,并且将读取/ public/system中的图像!但要小心,因为它改变了你的"静态"资产的路径......如果你需要来自gem的资产,它可能无法在开发中正确加载它们......

[结束编辑]

剩下的问题有答案!

那么,为什么我的开发应用程序正在渲染静态预编译资产?

实际上,如果您预先编译资产,则默认情况下,rails会在开发和测试环境中从公用文件夹和资产文件夹中呈现资产.通常来自公用文件夹的资产应该覆盖来自assets文件夹的资产,但事实并非如此,即使这样,我们也会失去"debug_mode"的好处,因为我们每次都需要预编译资产.因此......在开发和测试环境中进行本地预编译时,资产会呈现两次.

因此,通过在development.rb文件中添加"config.serve_static_assets = false",您可以以某种方式覆盖告诉Rails在公用文件夹中查找资产的默认行.我希望有一天他们会做一些关于本地预编译资产的事情.

感谢那些帮助我进行调查的人:)

Kulgar.

javascript ruby development-environment ruby-on-rails asset-pipeline

21
推荐指数
1
解决办法
6603
查看次数

Rails - 如何通过它订购模型有很多关联?

我有两个型号:

#Product
class Product < ActiveRecord::Base
  has_and_belongs_to_many :categories
  attr_accessible :name
  ...
end

#Category
class Category < ActiveRecord::Base
  has_and_belongs_to_many :products, :order => "name ASC"

  attr_accessible :name, :priority
end
Run Code Online (Sandbox Code Playgroud)

我想按照最高优先级的类别订购我的产品,然后按产品名称订购

例如,我有:3类:

  • 糖果,优先级= 3
  • 水果,优先级= 1
  • 甜点,优先级= 2

3件商品:

  • 巧克力冰淇淋,有甜点和糖果类别,
  • 饼干,有甜点和糖果类,
  • 猕猴桃,有甜食,水果和甜点类

而且我希望他们这样订购:

  • 猕猴桃(首先因为水果是最优先的)
  • 巧克力冰淇淋(第二个因为巧克力来自饼干,它们都有相同优先级的类别)
  • 饼干

我怎么能在Rails中这样做?我不希望我的产品被复制,我知道这样做很容易:

Category.order("priority ASC").each do |cat|
  cat.products.order("name ASC").each do |product|
  end
end
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,新西兰,巧克力冰淇淋和饼干将被复制,因为它们都有几个类别.有没有一种简单的方法来删除重复?或者有没有办法直接按类别优先顺序订购产品?

编辑:有关我想要实现的更多细节

事实上,我想要的是一张巨大的桌子,在左边,我有所有产品(每个独特产品只有一行)按类别排序......所以我可以有这样的东西:

  • 类别 - 产品
  • 水果 - 香蕉
  • 水果 - 苹果
  • 水果 - 猕猴桃
  • 甜点 - 巧克力冰淇淋
  • 甜点 - 饼干
  • 甜 - 巧克力糖
  • 甜 - …

ruby-on-rails has-and-belongs-to-many model-associations

5
推荐指数
1
解决办法
2739
查看次数

Ruby-如何在不重新编码已编码字符的情况下编码URL

我有一个简单的问题:用户可以通过特定输入在我的网站中以特定形式发布网址。我想对发布的网址进行编码,因为有时用户会发送带有奇怪和/或非ASCII字符的网址(例如éàç...)。例如:https://www.example.com/url-déjà-vu

因此,我尝试使用URI.escape('https://www.example.com/url-déjà-vu')哪种方法有效,但是如果您具有以下网址,URI.escape('https://somesite.com/page?stuff=stuff&%20')则会得到: => "https://somesite.com/page?stuff=stuff&%2520"

%字符已编码,不应如此,因为%20已经是编码字符。然后我以为我可以这样做:

URI.escape(URI.decode('https://somesite.com/page?stuff=stuff&%20'))
=> "https://somesite.com/page?stuff=stuff&%20"
Run Code Online (Sandbox Code Playgroud)

但是,如果您的网址中带有“ /”编码,则存在问题,例如:

URI.escape(URI.decode('http://example.com/a%2fb'))
=> "http://example.com/a/b"
Run Code Online (Sandbox Code Playgroud)

“ /”应保持编码状态。

所以...全部放在一起:我想对用户发布的url进行编码,但在ruby中将已经编码的字符保留不变。知道我该怎么做而不会头疼吗?

谢谢 :)

ruby ruby-on-rails

3
推荐指数
1
解决办法
1048
查看次数

如何在Rails中的子文件夹中组织迁移文件?

有没有办法在db/migrate文件夹中组织迁移文件?

因为你在这个文件夹中很快就有大量的迁移文件,所以有这样的东西会很棒:

  • db/migrate/user_migrations/
    • timestamp_create_users.rb
    • timestamp_create_addresses.rb

等等...

有一个简单的方法吗?某种配置?这是一种不好的做法,我绝对不应该这样做吗?

如果有人有任何关于此的信息,我会很高兴听到!

ruby directory ruby-on-rails rails-migrations

0
推荐指数
1
解决办法
704
查看次数