0

私はモデルを持っています:

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'
4

1 に答える 1

0

私が理解しているように、URL内にユーザー名が必要であり、それが一意であることを確認しますよね? 乗船も同様です。

まず第一に、内部にスラッシュがあり、特別な文字であるため、ユーザーパラメーターはあまり良くありません。これらの値の両方が必要な場合は、ダッシュなどの他の区切り記号を使用します。

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

次に、URL で Board パラメータをオーバーライドする必要がある場合は、Board モデル内で同じことを行う必要があります。

  def to_param
    name
  end

次に、ルートを調整する必要があります。

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

これで、次のようなリンクを使用できるようになります。

redirect_to user_board_url(@board)

ユーザーが例として使用した URL を開くと、リクエストはshowパラメータを持つ BoardsController のアクションになります。

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

でいくつかのカスタム値を使用する場合は注意してくださいto_param。それらの値を適切にエスケープしてください。

于 2013-10-14T13:39:11.997 に答える