Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 通过ruby创建一个漂亮的url_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 通过ruby创建一个漂亮的url

Ruby on rails 通过ruby创建一个漂亮的url,ruby-on-rails,ruby,Ruby On Rails,Ruby,好的,我希望事件的标题在url中,比如 /events/party-at-mikes 我是这样做的 Event.find_by_title(params[:title]) 我的链接 <%= link_to('<span>EVENTS</span>', course_event_path(obj.golf_course.city.permalink, obj.golf_course.permalink, obj.title), :class => 'rig

好的,我希望事件的标题在url中,比如

/events/party-at-mikes
我是这样做的

Event.find_by_title(params[:title])
我的链接

 <%= link_to('<span>EVENTS</span>', course_event_path(obj.golf_course.city.permalink, obj.golf_course.permalink, obj.title), :class => 'right eve_bnt') %>

我需要做的是将-放在空格的空格中,并在查找捕获上,您应该真正查看宝石。它声称完全按照您的意图进行操作,并处理许多边缘案例。让这有点痛苦的主要原因是:如果两个事件的标题完全相同怎么办

忽略角案例,正确的方法是重载类的两个方法:

class Event < ActiveRecord::Base
    ...

    # This is used automatically to build the :id component of the url
    # in the form /models/:id
    def to_param
        self.title
    end

    # Now assuming that you just use Event.find(params[:id]),
    # you probably want Event.find to work differently.
    def self.find(identifier)
        self.find_by_title(identifier)
    end

    ...
end

你应该好好看看宝石。它声称完全按照您的意图进行操作,并处理许多边缘案例。让这有点痛苦的主要原因是:如果两个事件的标题完全相同怎么办

忽略角案例,正确的方法是重载类的两个方法:

class Event < ActiveRecord::Base
    ...

    # This is used automatically to build the :id component of the url
    # in the form /models/:id
    def to_param
        self.title
    end

    # Now assuming that you just use Event.find(params[:id]),
    # you probably want Event.find to work differently.
    def self.find(identifier)
        self.find_by_title(identifier)
    end

    ...
end

看一看

看一看

安德烈斯建议重写参数以使用title,但这是不可接受的,因为您不需要空格等。您需要的是模型的永久链接或slug,存储在下面示例中名为“slug”的字符串字段中。这是在保存记录时创建的,并且随后永不更改:它被用作URL中id的替换。slug只有字母、数字和连字符,可以通过在末尾添加数字强制使其唯一。然后,更改为_param以使用slug,然后在控制器中按slug查找。乙二醇

before_create :set_slug

def set_slug
  slug = self.title.downcase.gsub(/[^a-z0-9]/,"-")
  suffix = ""
  while self.class.find_by_slug(slug)
    slug.gsub!(/#{suffix}$/,(suffix == "" ? 1 : suffix+=1).to_s) 
  end
  self.slug = slug
end

def to_param
  self.slug
end
在事件控制器中

  before_filter :load_event, :except => [:index, :new]
...
protected
  def load_event
    @event = Event.find_by_slug(params[:id])
  end

Andres建议重写_param以使用title,但这是不可接受的,因为您不需要空格等。您需要的是模型的永久链接或slug,存储在下面示例中名为“slug”的字符串字段中。这是在保存记录时创建的,并且随后永不更改:它被用作URL中id的替换。slug只有字母、数字和连字符,可以通过在末尾添加数字强制使其唯一。然后,更改为_param以使用slug,然后在控制器中按slug查找。乙二醇

before_create :set_slug

def set_slug
  slug = self.title.downcase.gsub(/[^a-z0-9]/,"-")
  suffix = ""
  while self.class.find_by_slug(slug)
    slug.gsub!(/#{suffix}$/,(suffix == "" ? 1 : suffix+=1).to_s) 
  end
  self.slug = slug
end

def to_param
  self.slug
end
在事件控制器中

  before_filter :load_event, :except => [:index, :new]
...
protected
  def load_event
    @event = Event.find_by_slug(params[:id])
  end

我肯定会在url中保留id,并附上一个友好的名称。如果您的记录不好,这会使调试更容易,而且实现起来也很简单。更不用说sql可以比varchar更快地找到int

把这个放进你的模型里。无需定义段塞方法,因为rails已经通过参数化提供了这种方法。它还有一个优点,就是需要对其他代码进行0次更改。这几乎适用于所有开箱即用的情况


  # Slug the url.
  def to_param
    "#{id}-#{title.parameterize}"
  end

我肯定会在url中保留id,并附上一个友好的名称。如果您的记录不好,这会使调试更容易,而且实现起来也很简单。更不用说sql可以比varchar更快地找到int

把这个放进你的模型里。无需定义段塞方法,因为rails已经通过参数化提供了这种方法。它还有一个优点,就是需要对其他代码进行0次更改。这几乎适用于所有开箱即用的情况


  # Slug the url.
  def to_param
    "#{id}-#{title.parameterize}"
  end

我真的不喜欢friendly_id改变调用Event.id的功能,它不再返回主键,而是返回命名的slug。否则就很好了!我不认为它只是为了参数而攻击id。我真的不喜欢friendly_id改变调用Event.id的功能,它不再返回主键,而是返回命名的slug。否则就很好了!我不认为它是黑客id,只是to_param。还有一个证明,只有to_param需要像friendly_id一样被覆盖。还有一个证明,只有to_param需要像friendly_id一样被覆盖。