Подтвердить что ты не робот

Доступ к маршрутам рельсов в javascript

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

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

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

4b9b3361

Ответ 1

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

Так решил написать свой собственный:

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

Ответ 2

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

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

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

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

то вы хотите вызвать действие индекса из файла javascript:

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

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

Ответ 3

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

ERB

<script>

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

  });

</script>

Haml

:javascript

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

  });

UPDATE: добавление предложений для случая public/javascripts/

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

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

});

Ответ 4

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

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

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

Ответ 5

Что я сделал на основе отличного ответа 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);
    }
});

Ответ 6

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

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

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

Ответ 7

  • gem установите "angular_rails_templates"
  • Создайте файл с именем angular_rails_templates.rb в папке config/initializers
  • скопируйте следующий код в файл и перезапустите сервер. (включая "модуль 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'