【问题标题】:Rails 3 routes double check on matchRails 3路线双重检查匹配
【发布时间】:2013-01-18 05:25:44
【问题描述】:

目前,我的 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

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

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

【问题讨论】:

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


    【解决方案1】:

    在你的控制器中,你会有这样的东西:

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

    您需要将其限制为用户的故事可能是这样的

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

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

    【讨论】:

      【解决方案2】:

      根据您的需要进行调整:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-14
        • 2011-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多