我有一个在.js
文件中运行的ajax调用,使用:
...
update: function(){
$.ajax({
url: '/groups/order_links',
...
但我宁愿使用路径
我制作了文件扩展名.js.erb
,我尝试添加:
...
update: function(){
$.ajax({
url: "#{order_links_groups_path}",
...
或
...
url: "#{order_links_groups_url}",
...
但在任何一种情况下我都得到404 - [HTTP/1.1 404 Not Found 76ms]
来自POST http://localhost:3000/groups/49
rake routes
显示我的路线包括:
...
PUT /groups/:group_id/links/:id(.:format) links#update
DELETE /groups/:group_id/links/:id(.:format) links#destroy
order_links_groups POST /groups/order_links(.:format) groups#order_links
groups GET /groups(.:format) groups#index
POST /groups(.:format) groups#create
new_group GET /groups/new(.:format) groups#new
edit_group GET /groups/:id/edit(.:format) groups#edit
定义为:
resources :groups do
resources :links
collection do
post 'order_links'
end
end
groups_controller
已
class GroupsController < ApplicationController
...
def order_links
params[:link].each_with_index do |id, index|
Link.where(id: id).update_all(['position = ?',index+1])
end
render :nothing => true
end
...
Rails 4.1
答案 0 :(得分:3)
"#{}"
用于Coffeescript中的字符串插值,所以我假设这是一个错误。我假设这个ajax请求所在的url是http://localhost:3000/groups/49
,因为如果你没有传入一个正确的url,那么它将使用当前路径。
"<%= order_links_groups_path %>"
会在ruby中查找变量。这可以工作,但资源目录中的JavaScript文件正在编译而不使用您的应用程序上下文。意义order_links_groups_path
将是未定义的。
这里的答案应该有所帮助:Route helpers in asset pipeline
<% url = MyRailsApp::Application.routes.url_helpers %>
url: "<%= url.order_links_groups_url %>"
答案 1 :(得分:3)
首先,让我为您解释一些事情:
-
Mime类型
Rails在控制器级别(而不是中间件)处理mime-types。
这意味着,如果您希望通过ajax的js
mime类型请求资源,则必须在控制器中定义其处理,而不是路由结构。
您将能够详细了解Rails如何处理mime类型here:
如果客户想要HTML,我们只需将它们重定向回该人 名单。如果他们想要JavaScript,那么它就是一个Ajax请求而我们 呈现与此操作关联的JavaScript模板。最后,如果 客户端需要XML,我们将创建的人员渲染为XML,但是使用 扭曲:我们还在渲染的XML中包含了人员公司,所以 你会得到类似......
这意味着如果您正在寻找处理JS回复,那么您将能够执行以下操作:
#app/controllers/groups_controller.rb
class GroupsController < ApplicationController
def order_links
...
respond_to do |format|
format.js
format.html
end
end
end
这允许您根据发送到控制器的mime类型创建/调用所需的各种响应。
-
<强>的Ajax 强>
关于Ajax调用,您需要注意不要在资产管道中使用任何动态链接。我知道Rails文档建议不然,但事实是如果你提供静态资产(如生产中推荐的那样),你将失去调用这些路由的能力。
当然,正如Ahmed
建议的那样,您可以依靠coffeescript
或erb
预处理来允许您根据需要使用该路线:
#app/assets/javascripts/application.js.coffee
update: function(){
$.ajax({
url: <%= order_links_groups_path %>,
...
这将路由您的javascript请求,允许您根据需要处理控制器中的mime类型。