Маршрутизация в Rails делает имя пользователя URL-адресом:
В моем приложении Rails есть Модель устройства - Пользователь и Модель реестра (У каждого пользователя есть один реестр).
Я хотел изменить свои маршруты так, чтобы вместо:
"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
# 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"
1 ответ
Когда вы создаете или обновляете свои модели, вы отправляете 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
Но в будущем возможны столкновения. Например, если у вас есть имя реестра users
, Итак, обычно предлагается использовать префиксы (match '/r/:name'
) или определить набор разрешенных имен, или выбрать безопасные имена для реестров.
PS я не думаю load_and_authorize_resource
будет работать для вашего show
действие по умолчанию. Потому что он ожидает, что params[:id] автоматически загрузит ресурс.