标签: rails-routing

Rails用句点(或句号)查询字符串.

我目前正在尝试处理RoR.我将两个字符串传递给我的控制器.一个是随机十六进制字符串,另一个是电子邮件.该项目用于对数据库进行简单的电子邮件验证.我遇到的问题是当我输入类似下面的内容来测试我的页面时:

http://signup.testsite.local/confirm/da2fdbb49cf32c6848b0aba0f80fb78c/bob.villa@gmailcom
Run Code Online (Sandbox Code Playgroud)

所有我在我的params hash中得到的:email'bob'.我离开了.中间gmailcom外面因为这会导致比赛根本不起作用.

我的路由匹配如下:

match "confirm/:code/:email" => "confirm#index"
Run Code Online (Sandbox Code Playgroud)

这看起来很简单,我需要的东西.我很难弄清楚这笔交易是什么,甚至是如何找到答案.任何帮助或指导将不胜感激.

ruby routes ruby-on-rails rails-routing query-string

5
推荐指数
2
解决办法
1831
查看次数

如何让Rails路由到字体文件的响应(eot)?

在我的rails(2.x)应用程序中.我想在我的视图中使用自定义字体.所以我在fonts文件夹下的public中添加了字体文件.当我尝试在url中或通过应用程序获取字体时,它会通过路由错误.我猜rails路由无法识别格式/文件.如果我错了,请纠正我并给我解决方案

css代码:

@font-face {
    font-family: 'Effra';
    src: url('/fonts/effra_std_rg-webfont.eot');
    src: url('/fonts/effra_std_rg-webfont.eot?#iefix') format('embedded-opentype'),
        url('/fonts/effra_std_rg-webfont.woff') format('woff'),
        url('/fonts/effra_std_rg-webfont.ttf') format('truetype'),
        url('/fonts/effra_std_rg-webfont.svg#EffraRegular') format('svg');
    font-weight: normal;
    font-style: normal;

}
Run Code Online (Sandbox Code Playgroud)

注意:我可以通过直接键入路径而不是eot文件来获取woff,ttf文件.

Error trace:
Unknown action
No action responded to fonts. Actions: XXXXXXsomeactionsXXXXX and rescue_404
Run Code Online (Sandbox Code Playgroud)

先谢谢,阿伦.

routing ruby-on-rails rails-routing embedded-fonts

5
推荐指数
1
解决办法
647
查看次数

如何为Rails应用程序创建应用程序范围的slug路由?

我正在研究的Rails应用程序中有许多不同的模型.我见过许多网站都使用了应用程序范围的slug路由方法.这是什么意思?

http://example.com/nick-oneill <-- This points to a User object
http://example.com/facebook    <-- This points to a Company object
http://example.com/developers  <-- This points to the users#index page
Run Code Online (Sandbox Code Playgroud)

我知道to_param并在应用程序中创建了读者友好的slug,但是我不知道有一种方法可以为各种对象提供根级别的slug.你可以认为这类似于Facebook的Graph API:有不同的对象类型,但它们都存在于https://graph.facebook.com/object-id

任何见解都将非常感谢!

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

5
推荐指数
1
解决办法
1385
查看次数

在命名空间下为命名路由助手添加前缀

这是常见命名空间的样子.

namespace :admin do
  resources :posts
end
Run Code Online (Sandbox Code Playgroud)

它创建了一个像这样的命名路线;

new_admin_post_path
Run Code Online (Sandbox Code Playgroud)

这是我的问题; 如何在命名空间下的命名路由中添加前缀(如本例中的"new")?

让我们说我的路线定义喜欢这个;

namespace :admin do
  get 'post/new' => 'posts#new', as: 'post'
end
Run Code Online (Sandbox Code Playgroud)

它创造了一条命名路线,如;

admin_post_path
Run Code Online (Sandbox Code Playgroud)

我想为这个命名的路由添加"new"前缀并使其看起来像new_admin_post_path我不想使用resources.

ruby-on-rails rails-routing

5
推荐指数
1
解决办法
5327
查看次数

如何使config.exceptions_app与rspec一起工作

在我的Rails 3.2应用程序中,我正在尝试使用config.exceptions_app通过路由表路由异常以呈现特定于错误的页面(尤其是401 Forbidden页面).这是我到目前为止配置的内容:

# application.rb
config.action_dispatch.rescue_responses.merge!('Error::Forbidden' => :forbidden)
config.exceptions_app = ->(env) { ErrorsController.action(:show).call(env) }

# development.rb
config.consider_all_requests_local       = false

# test.rb
config.consider_all_requests_local       = false
Run Code Online (Sandbox Code Playgroud)

现在问题的关键是:

module Error
  class Forbidden < StandardError
  end
end

class ErrorsController < ApplicationController
  layout 'error'

  def show
    exception       = env['action_dispatch.exception']
    status_code     = ActionDispatch::ExceptionWrapper.new(env, exception).status_code
    rescue_response = ActionDispatch::ExceptionWrapper.rescue_responses[exception.class.name]

    render :action => rescue_response, :status => status_code, :formats => [:html]
  end

  def forbidden
    render :status => :forbidden, :formats => [:html]
  end
end
Run Code Online (Sandbox Code Playgroud)

当我想渲染401响应时,我只是raise Error::Forbidden在开发环境中完美地工作.但是在rspec中运行示例时,例如:

it 'should return …
Run Code Online (Sandbox Code Playgroud)

rails-routing custom-exceptions rspec2 ruby-on-rails-3.2

5
推荐指数
1
解决办法
1357
查看次数

RSpec找不到我的命名路线

我有一个莫名其妙的困难时间让我的命名路线在我的rspec测试中工作.

这就是我所看到的:

1) Home GET / works!
 Failure/Error: get root_path
 NameError:
   undefined local variable or method `root_path' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0x007fe13b0c1538>
 # ./spec/requests/home_spec.rb:6:in `block (3 levels) in <top (required)>'

2) Home GET / shows products!
 Failure/Error: get products_path
 NameError:
   undefined local variable or method `products_path' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0x007fe13b0cdea0>
 # ./spec/requests/home_spec.rb:10:in `block (3 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)

规格/请求/ home_spec.rb

require 'spec_helper'

describe "Home" do
  describe "GET /" do
    it "works!" do
      get root_path
      response.status.should be(200)
    end
    it "shows products!" do
      get products_path
      response.status.should be(200) …
Run Code Online (Sandbox Code Playgroud)

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

5
推荐指数
1
解决办法
1815
查看次数

Rails 4路由:使用带动态段的命名空间

在讨论使用动态段的路由时,Ruby on Rails指南(v4.0.1)说" 你不能使用:namespace或:module with:controller path segment. "他们继续建议:" 如果你需要这样做然后使用约束:控制器匹配您需要的命名空间."

我在很多命名空间下有很多控制器.如果我可以在我的情况下使动态段工作,那么我可以使用routes.rb中的一行处理所有路由.也许是这样的:

get '/:namespace/:controller/:action'             #note: this isn't valid
Run Code Online (Sandbox Code Playgroud)

但这不起作用(见上文).我宁愿保留名称空间,所以我可以在我的routes.rb文件中为每个名称空间写出一个新行,然后添加一个约束来检查URL是否要求该名称空间.这不会是世界末日.它看起来非常干燥和耻辱,因为所有的路由信息​​都巧妙地呈现在URL中.

我只是想知道是否有任何偷偷摸摸的方式似乎(对我来说)像动态段路由的功能有点差距.是否可以让路由DSL运行一个块(与Constraints不同)执行比路由匹配的布尔值yes/no更复杂的块?或许我遗漏了标准Rails路由功能的工作方式.任何建议赞赏.

更新:只是拼出一点点.我对Rails指南的理解是,我需要有这样的行:

post ':controller/:action' , controller: /user_details\/[^\/]+/
post ':controller/:action' , controller: /preferences\/[^\/]+/
Run Code Online (Sandbox Code Playgroud)

...等等.如果我想要20个名称空间,那么我将需要20个这样的行.我只是想知道是否有一种更简洁的方式接近上面给出的我的1线理想.

ruby-on-rails rails-routing ruby-on-rails-4

5
推荐指数
1
解决办法
1036
查看次数

如何在Rails中设置路由的默认格式?

路由的代码如下:

  resources :orders, only: [:create], defaults: { format: 'json' }
  resources :users,  only: [:create, :update], defaults: { format: 'json' } 
  resources :delivery_types, only: [:index], defaults: { format: 'json' }
  resources :time_corrections, only: [:index], defaults: { format: 'json' }
Run Code Online (Sandbox Code Playgroud)

可以使用1个字符串为所有资源设置默认格式,每行不带"defaults"哈希值?谢谢.

ruby ruby-on-rails rails-routing

5
推荐指数
1
解决办法
2768
查看次数

在Rails 4中为URL Helpers设置默认命名空间?

我有一个Rails 4应用程序,其中所有控制器和视图分为两个名称空间,面向代理和面向backend客户frontend:

MyApp::Application.routes.draw do
  constraints subdomain: "admin" do
    namespace :backend do
      resources :events
    end
  end

  constraints subdomain: /.+/ do                
    namespace :frontend do
      resources :events
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

此外,所有控制器都继承自BackendControllerFrontendController:

controllers
??? application_controller.rb
??? backend
?   ??? events_controller.rb
??? backend_controller.rb
??? frontend
?   ??? events_controller.rb
??? frontend_controller.rb
Run Code Online (Sandbox Code Playgroud)

现在,需要生成路径的所有内容都必须以命名空间为前缀,例如respond_with [:backend, @event]form_for [:backend, @event].

有没有办法为每个控制器的URL助手设置默认命名空间,以便respond_with @event从继承自BackendController的控制器调用自动假定正确的命名空间?

ruby-on-rails rails-routing ruby-on-rails-4

5
推荐指数
1
解决办法
1018
查看次数

为什么在Rails中安装路由失败并显示"未初始化的常量API"?

我正在开发一个包含API使用grapegem 的应用程序.

这是我的Root班级:

module API
  class Root < Grape::API
    rescue_from :all do |e|
      Rack::Response.new(
        [ "Error: #{e.message}" ],
        500,
        { "Content-type" => "text/error" }
      ).finish
    end

    prefix "api"
    version 'v1', using: :path
    format :json
    error_format :json

    mount ::API::ServiceRequests
  end
end
Run Code Online (Sandbox Code Playgroud)

以下是我如何在路线中安装它:

mount API::Root => '/'

我收到的错误是: routes.rb:45:in阻止':未初始化的常量API(NameError)`

文件结构相似app/api/root.rb,我在我application.rb的文件中加载了这些代码:

config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails ruby-grape rails-routing

5
推荐指数
1
解决办法
3084
查看次数