标签: rails-routing

在Rails3中覆盖到/(root)的资源路由:不更改路径帮助器?

我是Rails3的新手,我基本上创建了一个subscribers脚手架,我只希望我的应用程序响应newcreate操作.

所以config/routes.rb我定义:

resources :subscribers, :only => [:new, :create]

哪种方式有效

GET /subscribers => subscribers#new
POST /subscribers => subscribers#create

现在我希望我的应用程序在/(root)上展示订阅者资源而不是/subscribers,所以这就是我所做的:

match '/' => "subscribers#new"
match '/' => "subscribers#create"
match '/' => "subscribers#thankyou"
resources :subscribers, :only => [:new, :create]

哪种方式有效,但可能不是最糟糕的事情:这里有我遇到的问题:

  1. 在创建问题后回到表单时,浏览器显示的是/subscribersURL而不是just /,表单是使用form_for(@subscriber)辅助方法创建的,因此path帮助程序必须以某种方式不受路由影响
  2. 理想情况下,我甚至不希望应用程序响应请求 /subscribers
  3. 我注意到一个奇怪的错误,当在断开连接时发布表单(从/,然后在连接回来时进行刷新(浏览器要求重新提交=> OK)时,Rails应用程序崩溃(我没有错误堆栈,但是这是生产),为什么?

此外,我尝试以这种方式设置路线:

resources :subscribers, :only => [:new, :create] do
  collection do
    post '/' => :create
    get '/' …

routes ruby-on-rails rails-routing ruby-on-rails-3

9
推荐指数
1
解决办法
5516
查看次数

在Rakefile中访问命名路由

我有一些像这样的命名路线rake routes:

birthdays GET    /birthdays(.:format)                             birthdays#index
Run Code Online (Sandbox Code Playgroud)

在rakefile中,我只是希望能够birthdays_url在我的视图中调用.

task :import_birthdays => :environment do
  url = birthdays_url
end
Run Code Online (Sandbox Code Playgroud)

但是我收到了一个错误 undefined local variable or method 'birthdays_url' for main:Object

rake ruby-on-rails rails-routing

9
推荐指数
1
解决办法
4587
查看次数

在Rails路由中测试什么?

我很好奇人们认为对路线进行充分/彻底的测试.我工作的人似乎想要在我们的路线文件中断言每条路线,无论标准如何.我觉得这是浪费时间,但也许我错了,我不知道这有什么价值.

在某些情况下,我可以在路由中看到一些价值.我们仍然有一些响应GET和POST请求的动作,虽然我一直想要摆脱它们.我们没有任何关于lambdas或任何东西的疯狂约束,但是如果我们这样做,那似乎值得测试.

但对于正常的资源定义?

resources :foo, only: [:index, :show]
Run Code Online (Sandbox Code Playgroud)

我们断言这两条路线都存在,我们声称它们是GET并且它们会转到正确的控制器/动作.这有什么意义吗?感觉就像我们刚刚测试Rails一样.

在一个稍微相关的问题上,我更喜欢定义像上面那样的资源路径(包括only: [:index, :show]部分).resources :foo如果在该控制器上只有索引/显示操作,那么仅在路由文件中定义是否有任何后果?

在我看来,它可能只是使用更多的时间和/或内存,但它是否也是一个安全问题,或者是我不知道的非常糟糕的事情?

ruby-on-rails rails-routing

9
推荐指数
1
解决办法
1295
查看次数

路由错误 - 没有路由匹配[POST]"/ posts/new"

我正在浏览rubyonrails.org的"博客教程",当我尝试提交"帖子"时出现此错误:路由错误 - 没有路由匹配[POST]"/ posts/new"

我将教程中的代码复制并粘贴到我的代码中.这应该返回带有帖子的文本和标题的哈希值,但是我得到了上面的错误.

这是我的观点:

<%= form_for :post, url: posts_path do |f| %>
  <p>
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </p>

  <p>
    <%= f.label :text %><br>
    <%= f.text_area :text %>
  </p>

  <p>
    <%= f.submit %>
  </p>
<% end %>
Run Code Online (Sandbox Code Playgroud)

这是我的控制器:

class PostsController < ApplicationController
    def new
    end

    def create
        render text: params[:post].inspect
    end
end
Run Code Online (Sandbox Code Playgroud)

这是我的routes.rb:

Blog::Application.routes.draw do
    resources :posts
end
Run Code Online (Sandbox Code Playgroud)

rake路线给出了:

    posts GET    /posts(.:format)          posts#index
          POST   /posts(.:format)          posts#create
 new_post GET    /posts/new(.:format)      posts#new
edit_post GET    /posts/:id/edit(.:format) posts#edit
     post …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rails-routing

9
推荐指数
1
解决办法
2万
查看次数

Rails 3链接或在控制器中执行操作的按钮

在RoR 3中,我只想拥有一个链接/按钮来激活控制器中的某些操作/方法.具体来说,如果我点击页面上的"update_specs"链接,它应该转到我的产品控制器中的"update_specs"方法.我在这个网站上找到了建议:

link_to "Update Specs", :controller => :products, :action => :update_specs
Run Code Online (Sandbox Code Playgroud)

但是,当我点击此链接时,我收到以下路由错误:

路由错误没有路由匹配{:action =>"update_specs",:controller =>"products"}

我已经阅读了路由但我不明白为什么如果可以通过资源访问所有其他方法,我必须路由此方法:产品.

model-view-controller controller ruby-on-rails rails-routing

8
推荐指数
1
解决办法
9282
查看次数

在Rails中路由.URL中的点

to_paramCategory模型中覆盖了方法

def to_param
  name
end
Run Code Online (Sandbox Code Playgroud)

routes.rb

get '/:id' => 'categories#show', :as => :category
Run Code Online (Sandbox Code Playgroud)

name参数不包含任何点(foobar)时,一切正常,但是当它(f.o.o.b.a.r)时,我得到一个错误No route matches [GET].所以我的问题是:是否可以在路由中使用点作为参数名称的一部分?或者我可以做些什么来完成这个目的,也许是一些钩子或什么的.任何帮助表示赞赏.

routes ruby-on-rails rails-routing ruby-on-rails-3

8
推荐指数
1
解决办法
4197
查看次数

Rails 3 w/Devise:如何根据用户是否经过身份验证设置两个单独的主页?

我正在使用Rails 3和Devise创建一个应用程序,用户可以访问该网站并显示包含登录和注册表单的主页.这个页面有自己的控制器("主页"),所以它的路线是

root :to => "homepage#index"
Run Code Online (Sandbox Code Playgroud)

如果用户已经登录,我想显示不同的主页.这将考虑到根点

root :to => "dashboard#index"
Run Code Online (Sandbox Code Playgroud)

有没有办法在routes.rb中设置条件路由,这样我就可以在将用户路由到其中一个主页之前检查用户是否经过身份验证?

我尝试使用以下代码,但如果我没有登录,设计要求我登录,所以显然只有第一条路线有效.

authenticate :user do
  root :to => "dashboard#index"
end
  root :to => "homepage#index"
Run Code Online (Sandbox Code Playgroud)

此外,我希望网址在两种情况下都指向www.example.com,以便www.example.com/dashboard/index和www.example.com/homepage/index永远不会出现在浏览器中.

太感谢了 !!!

ruby-on-rails rails-routing devise

8
推荐指数
2
解决办法
2764
查看次数

Rails路由:将root定义为命名空间

我有2个控制器:

app/
   /controllers
      posts_controllers.rb
      /mobile
         posts_controllers.rb
Run Code Online (Sandbox Code Playgroud)

和我的routes.rb看起来像这样:

root :to => "posts#index"
resources :posts

namespace :mobile do
   root :to => "posts#index"
   resources :posts
end
Run Code Online (Sandbox Code Playgroud)

但是当我访问时/mobile,无论如何渲染第一个控制器的索引页面,也尝试了这个:

namespace :mobile do
   root :to => "mobile/posts#index"
   resources :posts
end
Run Code Online (Sandbox Code Playgroud)

但它给了我错误:uninitialized constant Mobile::Mobile 我想渲染第二个控制器的索引页面,我该怎么做?

编辑

通过输入/ mobile我想渲染位于此处的文件:

app/
   views/
       /mobile
          /posts
             index.html.erb
Run Code Online (Sandbox Code Playgroud)

但它在这里是rending文件:

app/
   views/
       /posts
          index.html.erb
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails rails-routing

8
推荐指数
3
解决办法
2万
查看次数

获取Rails嵌套资源以路由以更正嵌套控制器

在Rails 3.2.11中,我有以下路由定义

resources :foos do
    resources :bars
    resources :bangs, :controller => 'foos/bangs'
end
Run Code Online (Sandbox Code Playgroud)

这导致以下路线

     foo_bars GET    /foos/:foo_id/bars(.:format)            bars#index
              POST   /foos/:foo_id/bars(.:format)            bars#create
  new_foo_bar GET    /foos/:foo_id/bars/new(.:format)        bars#new
 edit_foo_bar GET    /foos/:foo_id/bars/:id/edit(.:format)   bars#edit
      foo_bar GET    /foos/:foo_id/bars/:id(.:format)        bars#show
              PUT    /foos/:foo_id/bars/:id(.:format)        bars#update
              DELETE /foos/:foo_id/bars/:id(.:format)        bars#destroy
    foo_bangs GET    /foos/:foo_id/bangs(.:format)           foos/bangs#index
              POST   /foos/:foo_id/bangs(.:format)           foos/bangs#create
 new_foo_bang GET    /foos/:foo_id/bangs/new(.:format)       foos/bangs#new
edit_foo_bang GET    /foos/:foo_id/bangs/:id/edit(.:format)  foos/bangs#edit
     foo_bang GET    /foos/:foo_id/bangs/:id(.:format)       foos/bangs#show
              PUT    /foos/:foo_id/bangs/:id(.:format)       foos/bangs#update
              DELETE /foos/:foo_id/bangs/:id(.:format)       foos/bangs#destroy
         foos GET    /foos(.:format)                         foos#index
              POST   /foos(.:format)                         foos#create
      new_foo GET    /foos/new(.:format)                     foos#new
     edit_foo GET    /foos/:id/edit(.:format)                foos#edit
          foo …
Run Code Online (Sandbox Code Playgroud)

controllers rails-routing nested-resources ruby-on-rails-3.2

8
推荐指数
1
解决办法
8424
查看次数

Rails 3路线:DRY会员

我需要将以下成员方法添加到许多资源中,有没有办法干掉它?

 member do
    get   :votes
    post  :up_vote
    post  :down_vote
  end
Run Code Online (Sandbox Code Playgroud)

在我的routes.rb

resources :news do
  resources :comments do
     member do
        get   :votes
        post  :up_vote
        post  :down_vote
      end
  end
end

resources :downloads do
  resources :whatever do
     member do
        get   :votes
        post  :up_vote
        post  :down_vote
      end
  end
end
Run Code Online (Sandbox Code Playgroud)

编辑

我实际上把它移到了一个像这样的模块中:

module Votable
  module RoutingMethods
    def votable_resources
      member do
        get   "up_votes"
        get   "down_votes"
        post  "up_vote"
        post  "down_vote"
      end
    end
  end # RoutingMethods
end
Run Code Online (Sandbox Code Playgroud)

现在,我的routes.rb看起来像这样:

require 'votable'

include Votable::RoutingMethods

MyApp::Application.routes.draw do

  namespace :main, :path => …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rails-routing ruby-on-rails-3

7
推荐指数
1
解决办法
1041
查看次数