1

我想对我的路由使用相同的 AJAX 调用。我如何设置网址?

路线:

put :sort, :path => 'activities/sort', :controller => 'activities'
put :sort, :path => 'articles/sort', :controller => 'articles'

JS:

$.ajax({
            type: "PUT",
            url: 'activities/sort',  # I wanna change this line
            data: {ids:newOrder}, 
            dataType: "html",
            error: function()
            {
                alert('Positions has not been saved.');
                $('#sortable').sortable('cancel');
            }
         });

我在想这样的事情:

url: <%= action: 'sort' %>

但它重定向到 'localhost:3000/sort' 但我想要 'localhost:300/current_controller/sort'

4

3 回答 3

3

您的路线生成以下内容

sort PUT      /activities/sort(.:format)      activities#sort

this SO question中所述

Sprockets 在 Rails 应用程序的上下文之外评估 ERB

因此,.js.erb默认情况下,文件无法访问 URL 辅助方法;必须明确包含它们。

<% 
  # at the top of your file somewhere
  url = Rails.application.routes.url_helpers
%>

// ...
url: <%= url.sort_path %>,
// ...
于 2012-08-17T01:08:13.877 回答
1

我使用这样的东西:

def javascript_variables(variables = nil)
  @inline_js_variables ||= {}
  @inline_js_variables.merge!(variables) and return if !variables.nil?

  output = ''

  @inline_js_variables.each do |variable, value|
    output << "var #{variable} = #{value.to_json};\n"
  end

  output.strip.html_safe
end

您可以将上述内容放入app/helpers/application_helper.rb. 然后在你的ApplicationController,你可以把它放在类的顶部。

helper :all

现在,在您的操作中,您可以执行类似的操作

def your_activities_action
  javascript_variables({ ajax_route_path: sort_activities_path })
end

def your_articles_action
  javascript_variables({ ajax_route_path: sort_articles_path })
end

在您的app/views/layouts/application.html.erb中,您可以将以下内容放入<head>

<script>
  <%= javascript_variables %>
</script>

最后,在您的.js文件中,您可以ajax_route_pathurl参数中使用。

url: ajax_route_path,

根据这个答案和我的另一个答案,你应该能够拼凑出你想要完成的事情。例如,如果您需要两者sort_activities_pathsort_articles_path包含在同一个操作中

def your_articles_action
  javascript_variables({ ajax_activities_route_path: sort_activities_path,
                         ajax_articles_route_path:   sort_articles_path })
end

然后修改您的 Javascript 文件以相应地使用每个文件(例如,通过将 Ajax 方法包装在您的问题中的函数中,接受路由url作为参数)

于 2012-08-17T03:20:06.013 回答
0

尝试/在前面放一个,如下所示:

'/activities/sort'

否则,正如您所说,它将使用,/current_controller/activities/sort因为没有/前面,路径是相对的而不是绝对的。

于 2012-08-17T01:08:15.380 回答