如何减少Rails 3 Web应用程序中的重定向?

时间:2011-10-25 11:13:41

标签: performance ruby-on-rails-3 routing

我是Rails的新手。我正在开发一家商店建设者。

我想要什么

我想要每个商店的根级网址。

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

的routes.rb

...
resources :shops
match ':url' => 'shops#show', :constraints => { :url => /[a-z|0-9]{4,30}/ }
...

问题

垃圾表现。 (当然,它也像罪一样丑陋。)

每当有人创建一个新商店(从我们的主页点击一下),它就会创建一个新商店并进行重定向。在New Relic中,我看到这是在扼杀性能 - 在“请求排队”中花费了大量时间。

是否有更简洁,更快捷的方法来实现我的目标?

2 个答案:

答案 0 :(得分:1)

我不确定为什么重定向会引起如此头疼,但是:

你可以这样做:

  • 通过AJAX电话创建商店。
  • 通过AJAX成功创建渲染展示视图,并返回html“string”。
  • 用JS替换页面内容,并使用pushstate更新URL。

可能有用:http://pjax.heroku.com/

它不是很漂亮,但如果重定向真的那么糟糕可能会有帮助吗?

答案 1 :(得分:1)

我不推荐这个,因为它违反了REST原则......

可以 create在完成对象创建后调用/呈现show操作(就像在失败时使用“new”一样)。这将消除重定向,但仍然显示相同的内容。

为什么你不想这样做有很多原因。我首先会在其他地方寻找性能改进。