我有一个控制器,可以同时响应htmljs.html视图呈现整个页面(包括页眉和页脚),而js视图仅替换#main.除了页眉和页脚,这两种格式都呈现相同的内容.我可以通过三个文件获得这种效果:

_show.html.erb
<div>Content!</div>

show.html.erb
<%= render "show" %>

show.js.erb
$("#main").fadeIn("<%= escape_javascript(render 'show') %>");

这是可行的,但如果我不需要单独的_show份,我会更喜欢.不幸的是,这不起作用:

show.html.erb
<div>Content!</div>

show.js.erb
$("#main").fadeIn("<%= escape_javascript(render 'show') %>");

因为Rails将查找show个部分,而不是实际视图.

有没有办法让Rails查找视图文件,而不是部分文件?

推荐答案

在另一个视图中渲染非局部视图并不完全是Rails的方式™. 您当前的解决方案可能更好,而且不是一种罕见的方法.如果你对部分名称与动作相同感到奇怪,请将其重命名为_body或其他合适的名称.

然而,如果你的观点可以被分享,就像在本例中那样,你可以把它做成一个布局.

这是因为,如果js模板不存在,Rails将为js操作呈现html个模板,这在一定程度上违背了最小意外的原则.这意味着您可以删除js模板和部分模板,只需创建一个名为fadein.js.erb:

# yourviews/show.html.erb
<div>Content!</div>

# layouts/fadein.js.erb
$("#main").fadeIn("<%= escape_javascript(yield) %>");

# YourController.rb
def show
  # ...
  respond_to do |wants|
    wants.html
    wants.js { render :layout => "fadein" }
  end
end

Ruby-on-rails相关问答推荐

rails:如何在表单验证后使用涡轮刷新列表

如何控制或定制S为模型使用的命名路由Rail()?

我try 使用Ruby on Rails7创建一个Carbon 足迹计算器.但我无法保存和用户S对象

Rails simple_form 元素与数据-... 刺激的属性?

在bash中匹配带有空格字符的字符串

当我必须更改 rspec 中的方法时,如何检测时间?

错误原始错误:未安装 ImageMagick/GraphicsMagick

在 Rails 3 中,如何在路由中使用锚点作为 ID?

来自控制台的 ActionCable.server.broadcast

Rails 将字符串与视图中的变量连接的最佳方法

未初始化的常量 ActionDispatch::Session::EncryptedCookieStore (NameError)

在 Rails 3.2 中更新多行

Rspec:测试实例变量的赋值

如何确定 Rails 是从 CLI、控制台还是作为服务器运行?

使用 javascript 提交 Rails 远程表单

未定义的方法 attr_accessible

Ruby 和 Ruby on Rails 离线 API 文档

如何在 Ruby 中生成随机日期?

Ruby on Rails 基本概念总结

加载常量时自动加载常量时检测到循环依赖