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

时间:2015-02-11 04:19:20

标签: javascript ruby-on-rails ajax coffeescript

我正在使用ajax请求来渲染部分内容。它有效,但对我正在使用的设计感觉不对。

设置:作为一个例子,我创建了一个基本的博客应用程序,它只是让每个休息操作(索引,显示,编辑,创建,销毁)都响应ajax请求。

以下是当前的事件流程:

  1. 使用remote: true选项
  2. 点击链接
  3. 相应的控制器操作响应javascript
  4. 转到 views/bloggers/correspondingActionName.js.coffee
  5. views / bloggers 目录中包含与其余操作相对应的所有js.coffee个文件。这些js.coffee文件中的每一个通常都会呈现html.erb部分。示例:
  6. 视图/博客/ edit.js.coffee

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

    视图/博客/ _edit.html.erb

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

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

    我尝试将 js.coffee.erb 文件放在 assets / javascripts 目录中,但它不断引发关于j render方法的错误。

    问题:有没有办法让它以我希望的方式运作?那就是:在assets / javascripts目录中保留所有javascript(甚至是与ajax请求相关的javascript)?或者,是否存在比我上述任何一种方式更常规的策略?或者:为什么我现在这样做是最好的方式,因为它感觉不对。

1 个答案:

答案 0 :(得分:1)

你现在正在做的事情实际上是传统的Rails方式。因为文件是* .erb,它代表“嵌入式Ruby”,这意味着它们被呈现为服务器端(并且必须呈现为服务器端)。资产目录适用于所有客户端端文件。我认为如果你打破正在发生的一切,最有意义的是,记住关于Rails的最重要的事情是默认值:

  1. 用户点击链接,该链接向您的服务器发出AJAX请求,位于Controller#action。
  2. Controller会在action方法
  3. 中执行您要求它执行的操作
  4. Controller通过defauly在views/controller/action.js.erb中呈现相应的视图,因为收到的请求是一个AJAX请求。如果请求是HTML请求,则默认视图为views/controller/action.html.erb
  5. 服务器返回的Javascript在客户端,在浏览器中执行。