Rails 3路由双重检查匹配

时间:2013-01-18 05:25:45

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

目前,我在我的routes.rb

上有这个
match '/:username' => 'profiles#show', :as => :public_profile

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

http://example.com/foo_username

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

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

这个链接应该转到故事#show action with 5-my-story作为其id(slug),这个故事由路径中提供的用户名拥有。如何在路由中配置? 我试过这个:

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

它可以工作,但是当我更改用户名的参数时,它仍然会转到故事中。它应返回未找到的路由,因为用户名不属于该故事。

我如何才能最好地实现这一目标?

2 个答案:

答案 0 :(得分:0)

在您的控制器中,您将拥有以下内容:

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

您需要将此限制为用户的故事,可能就像这样

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

然后你必须检查@story是否为nil,如果不是则返回404。

答案 1 :(得分:0)

根据您的需要进行调整:

# stories_controller.rb

def show
  @story = Story.find(params[:id])
  raise ActiveRecord::RecordNotFound unless @story.user.name == params[:username]
  # ...
end