誰でも私がRailsルート/名前ルートにJavaScriptでアクセスする方法を説明できますか?
以下は私が試したものの一部です http://github.com/jsierles/js_named_routes 。
しかし運はありません。
私はしばらくこの質問を調査していましたが、Rails 3.と互換性のある実装は見つかりませんでした。
自分で書くことにしました:
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は前処理が必要であることを認識しています。それ以外の場合、ファイルはそのまま提供されます。
要件を正しく理解している場合は、ビューの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つまたはどちらかがアプリケーションに適している可能性があります
lib/javascripts
で'*.js.erb'
のような名前のERBとrake
タスクを使用してJavaScriptテンプレートを作成し、デプロイする前にそれらのテンプレートをpublic/javascript
sに展開します(たとえば、Capistranoのステップとして)レシピなど)。その欠点は、テンプレートが展開されるまで、変更がサイトでライブで利用できず、.erb
拡張ファイルを使用したJavaScriptの正しい構文強調表示が得られない可能性があることです。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) {
});
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_controller
のreset
メソッドが呼び出されます。
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);
}
});