任何人都可以解释我如何在javascript中访问rails routes / names路由?
以下是我尝试过的一些事情 http://github.com/jsierles/js_named_routes
但没有运气。
答案 0 :(得分:40)
答案 1 :(得分:21)
kishore我认为这是最简单的方式,只需致电:
Rails.application.routes.url_helpers。* _路径
所以,如果你有你的routes.rb,那就说:
资源:用户
然后你想从javascript文件中调用索引操作,你可以:
$.get('<%= Rails.application.routes.url_helpers.users_path %>', function(data){ ...
考虑到js文件应该有.erb扩展名(或* .js.erb),因此rails知道必须进行预处理。否则,该文件将按原样提供。
答案 2 :(得分:6)
如果我正确理解您的要求,您希望视图中的Javascript代码可以访问指定的路由。如果是这样,那么一个简单的方法是通过模板(ERB,Haml等)呈现您的Javascript代码,然后扩展类似以下的路由:
<强> ERB 强>:
<script>
$.get('<%= some_named_route_path %>', function(data) {
});
</script>
<强> Haml的强>:
:javascript
$.get('#{ some_named_route_path }', function(data) {
});
更新:为public/javascripts/
案例
从公共文件夹访问命名路由有点棘手,但至少有两种方式可以想到,这些方法都不是完全令人满意的,但其中一种或哪一种可能适合您的应用
lib/javascripts
的ERB和'*.js.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) {
});
答案 3 :(得分:3)
bjg真的回答了这个问题,但我想我会提取相关部分并用一个例子进行扩充。
您只需为视图提供一个字符串变量,其值为命名的Rails路径,然后在表单的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
的按钮元素添加了一个钩子,因此单击该按钮会调用reset
foo_controller
方法。
答案 4 :(得分:1)
我根据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);
}
});
答案 5 :(得分:0)
如果您使用的是支持import
(ES6 + webpacker
)的JS管道,则可能要签出js_from_routes
,这是一个与Rails reloader无缝配合的代码生成库
对于您要从JS访问的每个端点,它将generate a method为您build a URL提供帮助或提出请求。
resources :video_clips, only: [:update], export: true
通过将in combination与axios
一起使用,这些生成的帮助程序可以方便,易于使用:
import VideoClipsRequests from '@requests/VideoClipsRequests'
VideoClipsRequests.update({ data: video })
.then(onVideoUpdate)
请记住,您可以通过提供自定义模板来调整生成的代码,以便它可以适应您正在使用的任何技术,甚至是纯jQuery。
好处:
答案 6 :(得分:-1)
请参阅http://tore.darell.no/pages/javascript_routes:
JavascriptRoutes将您的Rails路由转换为JavaScript。然后,您可以在浏览器(或任何其他JS环境)中访问(生成)它们。它支持普通和命名路由,并为后者创建辅助函数。
更新:如果你更喜欢jQuery,看起来好像有人分了这个:https://github.com/ajnsit/javascript_routes
答案 7 :(得分:-2)
library(leaflet)
## define a palette for hte colour
pal <- colorNumeric(palette = "YlOrRd",
domain = df$pop)
leaflet(data = df) %>%
addTiles() %>%
addCircleMarkers(lat = ~lat, lng = ~long, popup = ~name,
color = ~pal(pop), stroke = FALSE, fillOpacity = 0.6) %>%
addLegend(position = "bottomleft", pal = pal, values = ~pop)
module CustomERBEngine