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

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

本文关键字:视图 Rails javascripts Ajax Assets      更新时间:2023-09-26

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

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

以下是当前的事件流程:

  1. 单击带有remote: true选项的链接
  2. 相应控制器的操作响应javascript
  3. 转到views/bloggers/correspondingActionName.js.coffee
  4. views/bloggers目录中,是与restful操作相对应的所有js.coffee文件。这些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,它代表"嵌入式Ruby",这意味着它们是在服务器端渲染的(并且必须在服务器端渲染)。assets目录用于所有客户端端文件。我认为,如果你分解正在发生的一切,记住了解Rails最重要的是默认值:,这是最有意义的

  1. 用户点击链接,在Controller#操作中向您的服务器发出AJAX请求
  2. 控制器执行您在action方法中要求它执行的任何操作
  3. Controller在views/controller/action.js.erb中渲染了相应的视图,因为收到的请求是AJAX请求。如果请求是一个HTML请求,那么默认视图是views/controller/action.html.erb
  4. 服务器返回的Javascript在客户端的浏览器中执行