【问题标题】:Ruby on rails: URL from ids to names/titles etcRuby on rails:从 id 到名称/标题等的 URL
【发布时间】:2009-09-05 01:38:35
【问题描述】:

我从生成脚手架创建了模型对象,但现在我想而不是链接到
/:controller/:id (/objectname/1) 到 /:controller/:title (/objectname/new_blog_post)。我该怎么做才能使链接正确链接到标题而不是 id?

我想从:

/:controller/:id 

/:controller/:name 

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    用于参数

    class User < ActiveRecord::Base
    
      def to_param
        name.blank? ? id : name
      end
    
    end
    

    或者看一个插件,acts_as_sluggable 和friendly_id 是我知道的。

    编辑:哦,是的,如上所述,确保你使用的任何东西都是独一无二的。

    编辑:

    它会像这样工作:

    class UsersController < ActionController::Base
    
      def index
        @users = User.all
      end
    
    end
    

    在视图中:

    <% @users.each do |user| %>
      <%= link_to user.name, user_path(@user.id) %>
    <% end %>
    

    如果那个用户的名字是 John,那么它会在你点击那个链接后呈现 /users/John

    【讨论】:

    • +1 你知道,我从来没有覆盖to_param。也许我应该开始这样做。
    • 其实,再看一遍,会不会是个好主意?如果 name 为空,他的发现在控制器中会是什么样子?
    • 还是找到有id的,如果没有名字的话,空白勾选它把id作为url。它未经测试,但它展示了它的基本思想。
    • 我想我的观点更针对如果他要执行您上面建议的事情,他至少应该验证名称的存在,使 id 部分无用,因为他的发现将是 @ 987654325@ 而不是 find。还是我弄错了?
    • 您仍然可以通过 id 找到。如果名称存在,它只是将名称呈现为该对象的 url,否则它照常使用 id。
    【解决方案2】:

    你需要做一些改变:

    当您执行 link_to 之类的操作时,您必须将 title 属性传递给任何路径/网址,例如

    post_path(@post)
    

    会变成

    post_path(@post.title)
    

    您还必须更新您的发现以按标题查找帖子,而不是 id,例如

    @post = Post.find(params[:id])
    

    会变成

    @post = Post.find_by_title(params[:title])
    

    这应该让你开始:)。显然,您还想检查标题并验证标题的唯一性。

    编辑:阅读 Robert Elwell 的回答后,也许我误解了这个问题。您是否已经有您为特定对象描述的路线,或者您是否使用“基本”路线进行此操作?如果是后者,您最好像 Robert 建议的那样编写自定义路线,然后执行我建议的一些事情。

    【讨论】:

      【解决方案3】:

      写一个custom route

      【讨论】:

        【解决方案4】:

        使用friendly_id。

        顺便说一句,生成网址对我不起作用。我已经将自己的代码写到模型中了

        def to_param
          self.friendly_id
        end
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多