在javascript中访问rails路由

时间:2010-07-15 16:40:29

标签: javascript ruby-on-rails routes

任何人都可以解释我如何在javascript中访问rails routes / names路由?

以下是我尝试过的一些事情 http://github.com/jsierles/js_named_routes

但没有运气。

8 个答案:

答案 0 :(得分:40)

我正在研究这个问题一段时间,并没有发现任何与Rails 3兼容的实现。

所以决定写我自己的:

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

答案 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/案例

添加建议

从公共文件夹访问命名路由有点棘手,但至少有两种方式可以想到,这些方法都不是完全令人满意的,但其中一种或哪一种可能适合您的应用

  1. 使用名为lib/javascripts的ERB和'*.js.erb'任务在(例如)rake中创建javascript模板,以便在部署之前将这些模板扩展为public/javascript s(比如说例如,在你的Capistrano食谱中)。缺点是,在扩展模板之前,您的更改无法在网站上实时显示,并且您可能无法使用.erb扩展文件获得正确的javascript语法
  2. content_for :head块中创建每视图javascript帮助程序函数,这些函数扩展命名路由并使这些路径可用于公共javascript文件中的代码。如果你对命名空间和约定小心,这可能会很好。缺点是调用这些javascript帮助程序的代码与定义它们的代码分离,这可能会使维护者感到困惑或容易被滥用。
  3. 在某些观点中:

    <% 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 combinationaxios一起使用,这些生成的帮助程序可以方便,易于使用:

import VideoClipsRequests from '@requests/VideoClipsRequests'

VideoClipsRequests.update({ data: video })
  .then(onVideoUpdate)

请记住,您可以通过提供自定义模板来调整生成的代码,以便它可以适应您正在使用的任何技术,甚至是纯jQuery。

好处:

  • 无需手动指定URL,从而避免错误并节省开发时间。
  • 如果重命名或删除了某个动作,则助手将不复存在,这会导致错误比404更易于检测。

答案 6 :(得分:-1)

请参阅http://tore.darell.no/pages/javascript_routes

  

JavascriptRoutes将您的Rails路由转换为JavaScript。然后,您可以在浏览器(或任何其他JS环境)中访问(生成)它们。它支持普通和命名路由,并为后者创建辅助函数。

更新:如果你更喜欢jQuery,看起来好像有人分了这个:https://github.com/ajnsit/javascript_routes

答案 7 :(得分:-2)

  1. gem安装&#34; angular_rails_templates&#34;
  2. 在config / initializers文件夹中创建名为angular_rails_templates.rb的文件
  3. 将以下代码复制到文件中并重新启动服务器。 (包括&#34;模块CustomERBEngine&#34;因为它无法通过4个空格添加到代码块中)
  4. 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