如何使用自定义to_param重定向到

时间:2013-10-14 13:06:38

标签: ruby-on-rails routes ruby-on-rails-4

我有模特:

class Board < ActiveRecord::Base
  belongs_to :user

  validates :name, presence: true, uniqueness: {scope: :user_id}
  validates :user, presence: true

  def to_param
    "#{user.username}/#{name}"
  end
end

在#create动作中,我想将用户重定向到:

redirect_to @board

因此对于拥有joe板的用户boardname,它会重定向到:/joe/boardname。而不是那样,它重定向到/boards/joe/boardname。知道为什么吗?

在我的路线中,我有:

resources :boards, except: [:new, :show]
get '/new' => 'boards#new', as: 'new_board'
get '/:username/:name' => 'boards#show', as: 'user_board'

1 个答案:

答案 0 :(得分:0)

根据我的理解你想要一个URL内的用户名,你确保它是唯一的,对吧? 同样适用于董事会。

首先你的用户参数不是很好,因为它内部有斜线,它是一个特殊的字符。如果您需要这两个值,请使用其他分隔符,如dash:

"#{user.username}-#{name}"

其次,如果你需要覆盖URL中的Board param你需要在Board模型中做同样的事情:

  def to_param
    name
  end

然后你需要调整你的路线:

resources :users do
  resources :boards, except: [:new, :show]
end

现在你应该能够使用这样的链接:

redirect_to user_board_url(@board)

当用户打开您用作示例的网址时,请求最终会在BoardsController的show操作中以params结束:

{ user_id: "joe", board_id: "boardname" }

to_param中使用某些自定义值时要小心,请确保正确地转义这些值。