使用整个路径作为路径的参数

时间:2014-01-29 16:19:21

标签: ruby-on-rails ruby regex routing

我想要一条路线,其中'/'后的所有字符串都是参数。

例如,如果网址为localhost:3000/posts/1/edit,那么params[:path]应该等于'posts / 1 / edit'

我试图做这样的事情

  resource :item, path: '/:path', only: [:show, :update, :create, :destroy], constraints: { path: /.+/, format: :json }

但是在这种情况下,如果我最后有.json,它也包含在路径参数中。我在约束/.+\./尝试了另一个正则表达式,但它也不起作用。

我做错了什么?谢谢你的支持!

2 个答案:

答案 0 :(得分:0)

在您的控制器中,使用env['PATH_INFO']代替params[:path]

答案 1 :(得分:0)

# SoAwesomeMan
# Rails 3.2.13
Awesome::Application.routes.draw do
  resources :items, path: ':_path', _path: /[^\.]+/
  # http://localhost:3000/posts/1/edit.json?q=awesome
  #   => {"q"=>"awesome", "action"=>"index", "controller"=>"items", "_path"=>"posts/1/edit", "format"=>"json"}
end 

class ItemsController < ApplicationController
  before_filter :defaults
  def defaults
    case request.method
    when 'GET'
      case params[:_path]
      when /new\/?$/i then new
      when /edit\/?$/i then edit
      when /^[^\/]+\/[^\/]+\/?$/ then show
      else; index
      end
    when 'POST' then create
    when 'PUT' then update
    when 'DELETE' then destroy
    else; raise(params.inspect)
    end
  end

  def index
    raise 'index'
  end

  def show
    raise 'show'
  end

  def new
    raise 'new'
  end

  def edit
    raise 'edit'
  end

  def create
    raise 'create'
  end

  def update
    raise 'update'
  end

  def destroy
    raise 'destroy'
  end
end