Доступ к маршрутам рельсов в JavaScript - PullRequest
30 голосов
/ 15 июля 2010

Может кто-нибудь объяснить, как я могу получить доступ к маршрутам маршрутов / названия маршрутов в JavaScript?

Вот некоторые из вещей, которые я пробовал http://github.com/jsierles/js_named_routes.

но не повезло.

Ответы [ 7 ]

40 голосов
/ 04 августа 2011

Я некоторое время изучал этот вопрос и не нашел никакой реализации, совместимой с Rails 3.

Поэтому решил написать свой:

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

22 голосов
/ 24 апреля 2014

Кишоре Я думаю, что это самый простой способ, просто позвоните:

Rails.application.routes.url_helpers. * _ Путь

Итак, если у вас есть в вашем route.rb, скажем:

ресурсы: пользователи

затем вы хотите вызвать действие index из файла javascript, вы делаете:

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

Учтите, что файл js должен иметь расширение .erb (или * .js.erb), чтобы rails знал, что его нужно предварительно обработать. В противном случае файл будет обслуживаться как есть.

6 голосов
/ 15 июля 2010

Если я правильно понимаю ваше требование, вы хотите, чтобы код Javascript в ваших представлениях имел доступ к указанным маршрутам.Если это так, то один простой способ сделать это состоит в том, чтобы визуализировать ваш код Javascript через шаблон (ERB, Haml и т. Д.), А затем развернуть маршруты примерно так:

ERB :

<script>

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

  });

</script>

Haml :

:javascript

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

  });

ОБНОВЛЕНИЕ: Добавление предложений для public/javascripts/ case

Доступ к именованным маршрутам из общей папкинемного хитрее, но есть как минимум 2 способа, которые приходят на ум, ни один из которых не является полностью удовлетворительным, но один или любой из них может подойти вашему приложению

  1. Создание шаблонов JavaScript в (скажем) lib/javascriptsиспользуя ERB с именем, подобным '*.js.erb', и задачу rake, чтобы развернуть эти шаблоны до public/javascript s перед развертыванием (например, в качестве шага в вашем рецепте Capistrano).Недостатком этого является то, что ваши изменения не будут доступны вживую на сайте, пока шаблоны не будут расширены, и вы можете не получить правильную подсветку синтаксиса вашего javascript с расширением .erb, файл
  2. Создать javascript для просмотравспомогательные функции в блоке content_for :head, которые расширяют именованные маршруты и делают их доступными для кода из ваших общедоступных файлов 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) {

});
3 голосов
/ 14 мая 2013

bjg действительно ответил на это, но я подумал, что я извлеку соответствующую часть и увеличу пример.

Вы просто предоставляете вашему представлению строковую переменную, значением которой является именованный путь Rails, и затем используете это значение в Javascript вашей формы. Пример, который иллюстрирует, как метод контроллера может указать путь для другого метода, который должен быть открыт сценарием при нажатии кнопки:

Файл config/routes.rb:

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

Commanding 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, но основная идея должна быть ясной. Сценарий добавляет хук к элементу кнопки с идентификатором reset_button, поэтому при нажатии на кнопку вызывается метод reset для foo_controller.

1 голос
/ 04 июня 2014

То, что я сделал, основываясь на великолепном ответе Теиму:

В вашем контроллере:

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);
    }
});
0 голосов
/ 23 июня 2016
  1. gem установить "angular_rails_templates"
  2. Создайте файл с именем angular_rails_templates.rb в папке config / initializers
  3. скопируйте следующий код в файл и перезапустите сервер. (включая «модуль CustomERBEngine», поскольку его нельзя добавить в блок кода на 4 пробела)

module CustomERBEngine

class ERBTemplate < Tilt::ERBTemplate

def evaluate(scope, locals, &block)
  scope.class_eval do
    include Rails.application.routes.url_helpers
    include Rails.application.routes.mounted_helpers
    include ActionView::Helpers
   end
      super
    end
  end
end

Tilt.register CustomERBEngine::ERBTemplate, '.erb'
0 голосов
/ 21 марта 2011

См. http://tore.darell.no/pages/javascript_routes:

JavascriptRoutes конвертирует ваши маршруты Rails в JavaScript. Затем вы можете получить к ним доступ (сгенерировать) в браузере (или в любой другой среде JS). Он поддерживает как нормальные, так и именованные маршруты, и создает вспомогательные функции для последних.

Обновление : похоже, что кто-то разветвлял это, если вы предпочитаете jQuery: https://github.com/ajnsit/javascript_routes

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...