将Ajax部分视图模板放在Assets/javascripts目录中,而不是视图目录、Rails中
Putting Ajax Partial View Templates in Assets/javascripts Directory Instead of Views Directory, Rails
我正在使用ajax请求来呈现部分。它是有效的,但我使用的设计有些不对劲。
Setup:例如,我制作了一个基本的博主应用程序,它只让每个restful操作(索引、显示、编辑、创建、销毁)响应ajax请求。
以下是当前的事件流程:
- 单击带有
remote: true
选项的链接 - 相应控制器的操作响应javascript
- 转到
views/bloggers/correspondingActionName.js.coffee
- 在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最重要的是默认值:,这是最有意义的
- 用户点击链接,在Controller#操作中向您的服务器发出AJAX请求
- 控制器执行您在
action
方法中要求它执行的任何操作 - Controller在
views/controller/action.js.erb
中渲染了相应的视图,因为收到的请求是AJAX请求。如果请求是一个HTML请求,那么默认视图是views/controller/action.html.erb
- 服务器返回的Javascript在客户端的浏览器中执行
相关文章:
- 在Rails中更新Div,而不更改更新请求后的视图
- 通过rails中的Ajax在控制器B的每个视图中渲染控制器a的视图
- Rails:将资产管道中的纯javascript限制为特定视图
- 从Rails视图填充HighChart数据
- rails 4.1.6 form_for coffeescript在多个视图上不起作用
- 使用hidden_field_tag助手将JavaScript变量的值传递到Rails视图
- 用于显示索引视图 Rails 中的页面的下拉链接
- 包括 Rails 中特定视图的外部 JS
- 如何将.js从视图移动到单独的资产 - Ruby On Rails
- 如何使rails上的所有图像异步加载视图页面
- Angularjs UI视图和Rails服务器端模板路由
- Rails-从一个视图到下一个视图的水平转换
- 如何在rails视图中定义gon变量(瘦文件)
- Rails:将值:视图传递到控制器,以使用Javascript/Ajax进行查看
- Rails:在Rails视图中使用javascript函数的正确语法
- 将Ajax部分视图模板放在Assets/javascripts目录中,而不是视图目录、Rails中
- Rails中同一视图中的多个AJAX表单
- 定期轮询数据库,Rails 视图更新而不刷新
- 部分渲染视图Rails
- 选择日期范围后更新视图(Rails, Javascript)