Rails 3路线对匹配进行双重检查



目前,我在我的路由。rb

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

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

http://example.com/foo_username

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

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

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

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

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

我如何最好地实现这一点?

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

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

你需要把它限制在用户的故事里比如像这样

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

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

根据您的需要调整:

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

相关内容

  • 没有找到相关文章

最新更新