我可以使用js ajax调用的路径路径吗?
我有一个Ajax调用在.js
文件,该工程使用:我可以使用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
"#{}"
用于Coffeescript中的字符串插值,所以我假设这是一个错误。我假设这个ajax请求的url是http://localhost:3000/groups/49
,因为如果你没有传递正确的url,那么它将使用当前路径。
"<%= order_links_groups_path %>"
会在红宝石中寻找变量。这将工作,但资产目录中的JavaScript文件正在编译而不使用您的应用程序上下文。含义order_links_groups_path
将是未定义的。
这里的答案应该有所帮助:Route helpers in asset pipeline
<% url = MyRailsApp::Application.routes.url_helpers %>
url: "<%= url.order_links_groups_url %>"
首先,让我解释一些事情你:
-
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调用,你需要知道,你不应该在你的资产管道使用任何动态链接。我知道Rails文档建议,否则,但事实是,如果您提供静态资产(如生产中推荐的那样),您将失去调用这些路由的能力。
当然,作为Ahmed
建议,你可以依靠coffeescript
或erb
预处理,使您可以为您希望使用的路线:
#app/assets/javascripts/application.js.coffee
update: function(){
$.ajax({
url: <%= order_links_groups_path %>,
...
这将路由你的JavaScript的要求,让您处理按需要键入控制器。
似乎是一个很好的解决方案,但是我正在为#:0x000000051bbc50> (在/ home/durrantm/Dropnot/webs/rails_apps/linker/app /资产/ Java脚本/ sortable_hook.js.erb)'。我也试过'order_links_groups_url'并得到了同样的错误。 – 2014-08-31 12:33:57
顺便说一句我没有改变控制器,添加格式块。 – 2014-08-31 12:39:34
fyi我正在使用'.js.erb'对于'.js.erb'模板(您的示例适用于coffeescript),'url:'是否相同? – 2014-08-31 12:41:01
我确认这适用于Ruby on Rails 4.1应用程序。 – Ahmed 2014-08-31 13:52:14