Я новичок в Rails.Я разрабатываю конструктор магазинов.
Что я хочу
Я хочу URL-адрес корневого уровня для каждого магазина.
http://greatsite.com/my-shop-name
Мое решение
shop_controller.rb
def show
if params[:url]
@shop_ref = params[:url]
@shop = Shop.where(:url => @shop_ref).first
else
@shop_ref = params[:id]
@shop = Shop.find(@shop_ref)
redirect_to "/" + @shop.url
return
end
if @shop.nil?
render 'show_invalid_shop', :object => @shop_ref and return
end
render 'show' => @shop
end
def create
@shop_url = (0...8).map{65.+(rand(25)).chr}.join.downcase
@shop = Shop.new(:url => @shop_url)
if @shop.save
redirect_to "/" + @shop.url
else
render :action => "new"
end
end
rout.rb
...
resources :shops
match ':url' => 'shops#show', :constraints => { :url => /[a-z|0-9]{4,30}/ }
...
Проблема
Дерьмо Производительность.(Конечно, это тоже безобразно, как грех.)
Каждый раз, когда кто-то создает новый магазин (это один клик на нашей домашней странице), он создает новый магазин и выполняет перенаправление.В New Relic я вижу, что это убивает производительность - много времени тратится на «Очередь запросов».
Есть ли более аккуратный и быстрый способ достижения того, чего я хочу?