web-dev-qa-db-ja.com

JavaScriptでRailsルートにアクセスする

誰でも私がRailsルート/名前ルートにJavaScriptでアクセスする方法を説明できますか?

以下は私が試したものの一部です http://github.com/jsierles/js_named_routes

しかし運はありません。

30
kishore

私はしばらくこの質問を調査していましたが、Rails 3.と互換性のある実装は見つかりませんでした。

自分で書くことにしました:

https://github.com/railsware/js-routes

40
Bogdan Gusiev

kishore私はこれが最も簡単な方法だと思います、ただ電話してください:

Rails.application.routes.url_helpers。* _ path

それで、あなたがroutes.rbにいるなら、そうしましょう:

リソース:ユーザー

次に、javascriptファイルからインデックスアクションを呼び出す場合は、次のようにします。

$.get('<%= Rails.application.routes.url_helpers.users_path %>', function(data){ ...

Jsファイルには.erb拡張子(または* .js.erb)を付ける必要があることを考慮して、Railsは前処理が必要であることを認識しています。それ以外の場合、ファイルはそのまま提供されます。

22
rapofran

要件を正しく理解している場合は、ビューのJavascriptコードが名前付きルートにアクセスできるようにする必要があります。その場合、これを行う簡単な方法の1つは、テンプレート(ERB、Hamlなど)を介してJavaScriptコードをレンダリングし、次のようなルートを展開することです。

[〜#〜] erb [〜#〜]

<script>

  $.get('<%= some_named_route_path %>', function(data) {

  });

</script>

Haml

:javascript

  $.get('#{ some_named_route_path }', function(data) {

  });

更新:public/javascripts/ケースの提案を追加

パブリックフォルダから名前付きルートにアクセスするのは少し難しいですが、少なくとも2つの方法が考えられます。どちらも完全に満足できるものではありませんが、1つまたはどちらかがアプリケーションに適している可能性があります

  1. (たとえば)lib/javascripts'*.js.erb'のような名前のERBとrakeタスクを使用してJavaScriptテンプレートを作成し、デプロイする前にそれらのテンプレートをpublic/javascriptsに展開します(たとえば、Capistranoのステップとして)レシピなど)。その欠点は、テンプレートが展開されるまで、変更がサイトでライブで利用できず、.erb拡張ファイルを使用したJavaScriptの正しい構文強調表示が得られない可能性があることです。
  2. content_for :headブロックでビューごとのJavaScriptヘルパー関数を作成します。これにより、名前付きルートが展開され、パブリックJavaScriptファイルからコードで利用できるようになります。名前空間と規則に注意している場合、これはうまくいくかもしれません。欠点は、これらのJavaScriptヘルパーを呼び出すコードが、それらを定義するコードから分離されているため、メンテナーが混乱したり、乱用されたりする可能性があることです。

一部のビューでは:

<% content_for :head do %>
  <script>
    SomeNameSpace.helper_to_some_named_route = function() {
      return '%<= some_named_route_path %>
    };
  </script>
<% end %>

次にpublic/application.js

$.get(SomeNameSpace.helper_to_some_named_route(), function(data) {

});
6
bjg

bjgは実際にこれに答えましたが、関連する部分を抽出し、例を使って増幅したいと思いました。

Rails pathという名前の値を持つ文字列変数をビューに提供し、フォームのJavascriptでその値を使用します。コントローラーメソッドがパスを指定する方法を示す例ボタンを押すとスクリプトによって開かれる別の方法:

ファイルconfig/routes.rb

...
resource :foo, :only => [:show, :reset]
...
match 'foo_reset_path' => 'foo#reset'

rake routesを実行すると、他の出力の中でも特に次のものが生成されます。

foo             GET  /foo(.:format)            foo#show
foo_reset_path       /foo_reset_path(.:format) foo#reset

ここではfoo_reset_pathを使用しますが、このメソッドは、名前付きのRailsパスで使用することもできます。

ファイルapp/controllers/foo_controller.rb

...
def show
  @reset_path = "foo_reset_path" # simply the string you'd use in the
                                 # Rails code for opening the path
  ...
end
...
def reset
  ... # reset some variables to their default values
  redirect_to foo_path # causes the show method to be called, and the HTML
                       # page to be redisplayed
end

ファイルapp/views/foo/show.html.erb

...
<input type="hidden" id="reset_path" name="reset_path" value="<%= @reset_path %>">
...
<script>
$(document).ready(function() {
    ...
    /* Hang functionality on the "Reset form" button. */
    $('#reset_button').click(function () {
        var reset_path = $('#reset_path').val();
        window.open(reset_path, "_self")
    });
    ...
})
</script>

ここではJQueryを使用していますが、基本的な考え方は明確です。スクリプトは、IDがreset_buttonであるボタン要素にフックを追加します。これにより、ボタンをクリックすると、foo_controllerresetメソッドが呼び出されます。

3
Teemu Leisti

Teemuの素晴らしい答えに基づいて私がしたこと:

コントローラで:

def show
  @section = Section.find(params[:id])
  respond_to do |format|
    format.html
    format.json { render json: @section}
  end
end

あなたの見解では:

 <input type="hidden" id="section_path" data-path="<%= @section.id %>" name="section_path" value="foo">

あなたのjsで:

var id = $('#section_path').attr('data-path');

$.ajax({
    url:'/sections/'+ id +'.json',
    type:"GET",
    success: function (data){
        console.info(data);
    },
    error: function (xhr, status){
        console.info(xhr.error);
    }
});
1
jakeforaker