1

ルートに対して同じAJAX呼び出しを使用したい。URLを設定するには??

ルート:

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

このSOの質問で述べたように

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_pathでパラメーターで使用できますurl

url: ajax_route_path,

この回答と私の他の回答に基づいて、達成しようとしていることをつなぎ合わせることができるはずです。たとえば、 と の両方が同じアクションに含まれているsort_activities_path必要がある場合sort_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 に答える