Ruby on rails 通过ruby创建一个漂亮的url
好的,我希望事件的标题在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
/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一样被覆盖。