将 Ajax 部分视图模板放在 Assets/javascripts 目录而不是视图目录中,Rails

Putting Ajax Partial View Templates in Assets/javascripts Directory Instead of Views Directory, Rails

我正在使用 ajax 请求来呈现局部。它有效,但我使用的设计感觉有些不对劲。

设置:例如,我制作了一个基本的博客应用程序,它只执行每个 restful 操作(索引、显示、编辑、创建、销毁)响应 ajax 个请求。

这是当前的事件流程:

  1. A link 被点击 remote: true 选项
  2. 对应控制器的动作响应javascript
  3. 转到views/bloggers/correspondingActionName.js.coffee
  4. 那个views/bloggers目录里面是所有js.coffee文件对应于restful 行动。这些 js.coffee 文件中的每一个通常都呈现一个 html.erb 部分。示例:

views/bloggers/edit.js.coffee

$form = $('<%= j render("edit") %>').hide()
$bloggers = $('#listing_bloggers')
$bloggers.after($form)
$form.fadeIn 100

views/bloggers/_edit.html.erb

<div id="edit_blogger">
    <h1>Editing blogger</h1>
    <%= render 'form' %>
    <%= link_to 'Back', bloggers_path, remote: true%>
</div>

所有这一切感觉不对的部分是,感觉好像那些 js.coffee.erb 文件不应位于 views 目录中,而应位于 assets/javascripts 目录中。

我试图将那些 js.coffee.erb 文件放在 assets/javascripts 目录,但它一直抛出关于 j render 方法的错误。

问题:有没有办法让它按照我希望的方式工作?即:将所有 javascript(甚至与 ajax 请求相关的 javascript)保留在 assets/javascripts 目录中?或者,是否有比我上面描述的任何一种方法更传统的策略?或者:为什么我现在做的方式是最好的方式,因为感觉不对。

您现在使用的方式实际上是传统的 Rails 方式。因为文件是 *.erb,代表 "Embedded Ruby",这意味着它们正在 服务器 端呈现(并且必须呈现服务器端)。 assets 目录用于所有 client 端文件。我认为如果你分解正在发生的一切是最有意义的,记住关于 Rails 最重要的理解是默认值:

  1. 用户点击 link,在 Controller#action 向您的服务器发出 AJAX 请求。
  2. Controller 执行您在 action 方法中告诉它做的任何事情
  3. 控制器默认渲染views/controller/action.js.erb对应的视图,因为收到的请求是AJAX请求。如果请求是 HTML 请求,则默认视图为 views/controller/action.html.erb.
  4. Javascript 由服务器返回,在客户端,在浏览器中执行。