1

私の Rails アプリには、Device Model - User と Registry モデル (各ユーザーには 1 つのレジストリがあります) があります。

代わりに次のようにルートを変更したかった:

「http://localhost:3000/registries/3」

それが示している:

「http://localhost: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'

ショーアクションは機能しますが?

レジストリ コントローラ: class RegistriesController < ApplicationController before_filter :authenticate_user!, :except => :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"
4

1 に答える 1

0

モデルを作成または更新するときは、 または を送信しPOST /registriesますPUT /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ルートにパラメーターを追加して、リクエストに応じてhit showのみ追加することができますGET

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

しかし、将来的に衝突する可能性はまだあります。たとえば、レジ​​ストリ name があるとしますusers。そのため、プレフィックス ( match '/r/:name') を使用するか、許可された名前のセットを定義するか、レジストリに安全な名前を選択することが一般的に提案されています。

load_and_authorize_resourcePSデフォルトでは、あなたのshow行動にはうまくいかないと思います。params[:id] がリソースを自動的にロードすることを期待しているためです。

于 2012-06-15T11:19:27.030 に答える