2

私はコントローラーstreams_controllerとモデルを持っていstreamsます。

class StreamsController < ApplicationController
  def new
    @stream = Stream.new
  end

  def create
    @stream = Stream.new(params[:stream])
    if @stream.save
        flash[:success] = "Welcome!"
        redirect_to @stream
    else
        render 'new'
    end
  end


  def show
    @stream = Stream.find(params[:id])
  end
end

class Stream < ActiveRecord::Base
    attr_accessible :name, :email, :password, :password_confirmation
    before_save { |stream| stream.name = name.downcase }

    has_secure_password
.
.
.

基本的に show メソッドを動作させるにはlocalhost/streams/[id]、[id] が特定のストリームの ID である場所に移動する必要があります。URL を次のように再ルーティングすることは可能でしょうか: localhost/[name][name] は Stream モデルの :name 属性ですか?

したがって、基本的に、新しいストリームが作成されるたびに新しい URL が作成され、データベース内のストリームの名前に対応します。

これを実装するにはどうすればよいですか?

とにかく、助けや考えは大歓迎です!

4

3 に答える 3

2

この行match '/:name' => 'streams#show'は params[:name] を提供し、ストリームの show アクションにルーティングします。コントローラー名との競合が発生した場合は、適切なコントローラー アクションが優先されるように、この行を routes.rb ファイルの末尾に配置できます。もちろん、そもそも衝突が起こらないようにするのが最善だろう。

于 2012-06-09T14:30:58.503 に答える
1

URLのstreams一部をできるだけ短くしますが、空にはしません (ID の代わりに名前だけを使用する場合の衝突を避けるため)。

resources :streams, path: 's'

URL/s/stream-aはそれほど大きな妥協ではありません。

URL で id の代わりに name を使用する方法については、この Railscastを参照してください。

于 2012-06-09T14:27:25.787 に答える
0

ルートにストリームをロードできます。例えば:

begin
  streams = Streams.all.map{|s| s.slug}
  match '/:stream' => 'streams#show', :stream => Regexp.new( "(#{streams.join('|')})" )
rescue Exception => e
  logger = Logger.new STDOUT
  logger.warn e.message
end

slug名前の代わりに使用したことに注意してください。ここでは安全な言葉を使用することが重要です。したがって、ストリームslugの に基づいてを作成できます。nameまた、他のルートをオーバーライドするべきではありません。

于 2012-06-09T14:29:37.500 に答える