0

現在、routes.rbにこれがあります

match '/:username' => 'profiles#show', :as => :public_profile

ここで、この形式を使用し、別のパラメーターを追加して、別のルートに別の一致を作成します。これを説明する方法はわかりませんが、例を挙げましょう。上記の一致で:

http://example.com/foo_username

これはfoo_usernameのプロファイルに接続します。今、私はこのようなURLが欲しいです:

http://example.com/foo_username/5-my-story

このリンクは、ID(スラッグ)として5-my-storyを使用してstories#showアクションに移動する必要があります。このストーリーは、パスで指定されたユーザー名によって所有されます。ルートでそれを構成するにはどうすればよいですか?私はこれを試しました:

match '/:username/:id' => 'stories#show', :as => public_story

それは機能しますが、ユーザー名のパラメーターを変更すると、それでもストーリーに移動します。ユーザー名がストーリーを所有していないため、見つからないルートを返す必要があります。

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

4

2 に答える 2

0

これをニーズに合わせて調整します。

# stories_controller.rb

def show
  @story = Story.find(params[:id])
  raise ActiveRecord::RecordNotFound unless @story.user.name == params[:username]
  # ...
end
于 2013-01-18T05:34:22.057 に答える
0

コントローラーには、次のようなものがあります。

@story = Story.find(params[:id])

これをユーザーのストーリーに制限する必要があります

@user = User.find_by_username( params[:username] )
@story = @user.stories.find(params[:id])

次に、@story が nil かどうかを確認し、そうでない場合は 404 を返す必要があります。

于 2013-01-18T05:31:10.783 に答える