我是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中,我看到这是在扼杀性能 - 在“请求排队”中花费了大量时间。
是否有更简洁,更快捷的方法来实现我的目标?
答案 0 :(得分:1)
我不确定为什么重定向会引起如此头疼,但是:
你可以这样做:
它不是很漂亮,但如果重定向真的那么糟糕可能会有帮助吗?
答案 1 :(得分:1)
我不推荐这个,因为它违反了REST原则......
但可以 create
在完成对象创建后调用/呈现show
操作(就像在失败时使用“new”一样)。这将消除重定向,但仍然显示相同的内容。
为什么你不想这样做有很多原因。我首先会在其他地方寻找性能改进。