Rails中的路由使用户名成为URL:

在我的Rails应用程序中,有Device Model – User和Registry模型(每个用户都有一个注册表)。

我想改变我的路线,而不是:

的 “http://本地主机:3000 /注册/ 3”

表明:

“HTTP://本地主机:3000 / erinwalker”

所以我改变了路线

match '/:name' => "registries#show" 

并且我的控制器中的show动作:

 def show @user = current_user @user = User.find_by_name!(params[:name]) @registry = @user.registry 

它可以工作,但是当我现在首先创建或更新注册表时,它说:

 Couldn't find User with name = app/controllers/registries_controller.rb:21:in `show' 

尽管节目动作有效吗?

注册表控制器:类RegistriesController :show load_and_authorize_resource

 # GET /registries # GET /registries.json def index @registries = Registry.all @user = current_user respond_to do |format| format.html # index.html.erb format.json { render json: @registries } end end # GET /registries/1 # GET /registries/1.json def show @user = current_user @user = User.find_by_name!(params[:name]) @registry = @user.registry respond_to do |format| format.html # show.html.erb format.json { render json: @registry } end end # GET /registries/new # GET /registries/new.json def new @registry = Registry.new @user = current_user respond_to do |format| format.html # new.html.erb format.json { render json: @registry } end end # GET /registries/1/edit def edit @registry = Registry.find(params[:id]) @user = current_user end # POST /registries # POST /registries.json def create @registry = current_user.build_registry(params[:registry]) @user = current_user respond_to do |format| if @registry.save format.html { redirect_to @registry, notice: 'Registry was successfully created.' } format.json { render json: @registry, status: :created, location: @registry } else format.html { render action: "new" } format.json { render json: @registry.errors, status: :unprocessable_entity } end end end # PUT /registries/1 # PUT /registries/1.json def update @registry = Registry.find(params[:id]) @user = current_user respond_to do |format| if @registry.update_attributes(params[:registry]) format.html { redirect_to @registry, notice: 'Registry was successfully updated.' } format.json { head :no_content } else format.html { render action: "edit" } format.json { render json: @registry.errors, status: :unprocessable_entity } end end end 

我的所有路线:

 Mystorkparty::Application.routes.draw do devise_for :users resources :registries root :to => "static_pages#home" match '/home', to: 'static_pages#home' match '/:name' => "registries#show" 

创建或更新模型时,可以发送POST /registriesPUT /registries/1

/registries与您的上一个规则match '/:name' => "registries#show"匹配,因此请求命中show动作。

如果你运行rake routes你应该看到这样的东西:

  POST /registries(.:format) registries#create PUT /registries/:id(.:format) registries#update DELETE /registries/:id(.:format) registries#destroy /:name(.:format) registries#show 

您可以在路线中添加method参数,这样它只会在GET请求中hit show

 match '/:name' => "registries#show", :via => :get 

但未来仍有可能发生冲突。 例如,如果您有注册表名称users 。 因此,通常建议使用前缀( match '/r/:name' )或定义允许名称集,或为注册表选择安全名称。

PS我认为默认情况下load_and_authorize_resource用于您的show动作。 因为它希望params [:id]自动加载资源。