Может ли кто-нибудь объяснить, как я могу получить доступ к маршрутам маршрутов/имен маршрутов в javascript?
Ниже перечислены некоторые из вещей, которые я пробовал http://github.com/jsierles/js_named_routes.
но не повезло.
Может ли кто-нибудь объяснить, как я могу получить доступ к маршрутам маршрутов/имен маршрутов в javascript?
Ниже перечислены некоторые из вещей, которые я пробовал http://github.com/jsierles/js_named_routes.
но не повезло.
Я изучал этот вопрос некоторое время и не нашел никакой реализации, совместимой с Rails 3.
Так решил написать свой собственный:
kishore Я думаю, что это самый простой способ, просто позвоните:
Rails.application.routes.url_helpers. * _ Путь
Итак, если у вас есть на ваших маршрутах .rb, скажем:
ресурсы: пользователи
то вы хотите вызвать действие индекса из файла javascript:
$.get('<%= Rails.application.routes.url_helpers.users_path %>', function(data){ ...
Учтите, что файл js должен иметь расширение .erb(или *.js.erb), поэтому рельсы знают, что необходимо предварительно обработать. В противном случае файл будет обслуживаться как есть.
Если я правильно понимаю ваше требование, вы хотите, чтобы 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 способа, которые приходят на ум, ни один из которых не является полностью удовлетворительным, но один или любой из них может удовлетворить ваше приложение.
lib/javascripts
, используя ERB с именем вроде '*.js.erb'
и rake
, чтобы развернуть эти шаблоны в public/javascript
перед развертыванием (например, как шаг в вашем рецепте Capistrano). Недостатком этого является то, что ваши изменения не становятся доступными в прямом эфире на сайте до тех пор, пока шаблоны не будут расширены, и вы можете не получить правильную синтаксическую подсветку вашего javascript с файлом расширения .erb
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) {
});
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
.
Что я сделал на основе отличного ответа 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);
}
});
См. http://tore.darell.no/pages/javascript_routes:
JavascriptRoutes преобразует маршруты Rails в JavaScript. Затем вы можете получить (сгенерировать) их в браузере (или в любой другой среде JS). Он поддерживает как обычные, так и именованные маршруты и создает вспомогательные функции для последнего.
Обновить. Похоже, что кто-то разветкил это, если вы предпочитаете jQuery: https://github.com/ajnsit/javascript_routes
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'