比如说 users 下面的 show.html.erb,加载这个 show 页面的时候执行一段 js,把这段 js 放到 show 页面里可以,但是不想和 js 和 html 都混到一个页面里边去,能不能放到 assets 下面,而且又只对 show 页面其左右?
可以是可以,但从缓存的角度出发,其实还是推荐通过 asset pipeline 一股脑儿一起加载。
@victorjames
使用 content_for 以及 yield,可以参照 ruby-china,全站的 stylesheet 以及 js 都是这么组织的。
楼上说的都对。
如果一定要对一个页面有效,建议看一下 using-nested-layouts 相关资料 http://guides.rubyonrails.org/layouts_and_rendering.html#using-nested-layouts
难免有些项目中,会有单独页面加载特定的 js 的需求。如果大部分页面都有单独的 js,我之前用过这样的方法,在 layout 中,加上:
<%= javascript_include_tag params[:controller] %>
然后为每一个 controller 生成一个相应的 js.erb。
这里的关键是粒度的控制。一般来说,为每一个 action 都加一个单独的 js 文件太过了,一个 controller 一个比较合适。
如果是极个别的页面要用,则直接用 content_for 就可以了(在里面直接写 javascript,或是链到 js 文件)。
我是喜欢给每个 controller 定一个 base 模板,所有的 action 都调用它。里面就可以写针对 controller 级公共的代码,比如 css,js 引用,二级菜单,面包屑... 当时还给 Rails 提过 pull request 让 scaffold 生成 view 的时候多生成个 _base.html.erb 的文件,结果被拒,原因是,这是个别的需求
我在学习 rails,用的是 5.0 版本,也是刚刚解决这个问题。在 assets 目录下,找到,application.js 和 application.css 两个文件,把里面的 require_tree 删除。然后把你需要引用的 js 或 css 在 config/initialize/assets.rb 文件中注册下,如 Rails.application.config.assets.precompile += %w(index.css),最后在 html 页面中使用 <%=stylesheet_link_tag "index" %>即可引用该 css 样式了
网站有一个 welcome 页面,是独立设计的,跟其他页面差别很大,我是这样做的:
在 assets/javascript 中新建 welcome.js, 在 application.js 按需引入
assets/javascript
welcome.js
application.js
添加预处理配置:config/initializers/assets.rb
Rails.application.config.assets.precompile += %w( welcome.js welcome.css ) ``