how do I make the URL's in Ruby on Rails SEO friendly knowing a @vendor.name?

前端 未结 7 1791
你的背包
你的背包 2021-02-04 12:06

My application is in RoR

I have an action/view called showsummary where the ID has been passed into the URL, and the controller has used that to instantiate @vendor wher

7条回答
  •  陌清茗
    陌清茗 (楼主)
    2021-02-04 12:33

    All of these solutions use find_by_name, which would definitely require having an index on that column and require they are unique. A better solution that we have used, sacrificing a small amount of beauty, is to use prefix the vendor name with its ID. This means that you dont have to have an index on your name column and/or require uniqueness.

    vendor.rb

    def to_param
      normalized_name = name.gsub(' ', '-').gsub(/[^a-zA-Z0-9\_\-\.]/, '')
      "#{self.id}-#{normalized_name}"
    end
    

    So this would give you URLs like

    /1-Acme

    /19-Safeway

    etc

    Then in your show action you can still use

    Vendor.find(params[:id])
    

    as that method will implicitly call .to_i on its argument, and calling to_i on such a string will always return the numerical prefix and drop the remaining text- its all fluff at that point.

    The above assumes you are using the default route of /:controller/:action/:id, which would make your URLs look like

    /vendors/show/1-Acme

    But if you want them to just look

    /1-Acme

    Then have a route like

    map.show_vendor '/:id', :controller => 'vendors', :action => 'show'
    

    This would imply that that it would pretty much swallow alot of URLs that you probably wouldnt want it too. Take warning.

提交回复
热议问题