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] 是特定 Stream 的 id。是否可以将 URL 重新路由到如下所示:localhost/[name]其中 [name] 是 Stream 模型的 :name 属性?

所以基本上每次创建新 Stream 时都会创建一个新 URL,它对应于数据库中 Stream 的名称。

我将如何实施呢?

无论如何,非常感谢任何帮助或想法!

4

3 回答 3

2

该行将match '/:name' => 'streams#show'为您提供 params[:name] 并路由到流中的 show 动作。如果碰巧与控制器名称发生冲突,您可以将此行放在 routes.rb 文件的末尾,以便适当的控制器操作优先。当然,最好首先确保这些冲突不会发生。

于 2012-06-09T14:30:58.503 回答
1

我会使streamsurl 的部分尽可能短,但不能为空(以避免在仅使用名称而不是 id 的情况下发生冲突)。

resources :streams, path: 's'

网址/s/stream-a不是那么大的妥协。

关于在您的 url 中使用 name 而不是 id ,请参阅此 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了 name 而不是 name - 在这里使用安全词很重要。所以你可以创建一个slug基于name流的。此外,它们不应覆盖其他路由。

于 2012-06-09T14:29:37.500 回答