0

目前,我的 routes.rb 上有这个

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

现在我想使用这种格式,并添加另一个参数来为另一个路由进行另一个匹配。我不知道如何解释,但让我举个例子。假设与上面的匹配:

http://example.com/foo_username

这将连接到 foo_username 的配置文件。现在我想要一个这样的网址:

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

此链接应转到以 5-my-story 作为其 id(slug)的 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 回答