Как я могу уменьшить перенаправления в моем веб-приложении Rails 3? - PullRequest
0 голосов
/ 25 октября 2011

Я новичок в 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 я вижу, что это убивает производительность - много времени тратится на «Очередь запросов».

Есть ли более аккуратный и быстрый способ достижения того, чего я хочу?

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Я бы не советовал, так как это нарушает принцип REST ...

Но вы могли бы иметь create вызывать / визуализировать действие show после того, как оно выполнено, его создание объекта (так же, как вы делаете с "новым", когда оно терпит неудачу). Это устранит перенаправление, но все равно покажет тот же контент, как если бы он имел.

Есть много причин, почему вы не хотели бы этого делать. Сначала я бы посмотрел на улучшения производительности в других местах.

1 голос
/ 10 ноября 2011

Я не уверен, почему перенаправления будут вызывать такую ​​головную боль, но:

Не могли бы вы сделать что-то вроде:

  • Создать магазин с помощью вызова AJAX.
  • При успешном создании через AJAX визуализируйте представление show и верните html «строку».
  • Замените содержимое страницы JS и используйте pushstate для обновления URL.

Может быть полезно взглянуть на: http://pjax.heroku.com/

Это не совсем красиво, но если перенаправления действительно настолько плохи, это может помочь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...