Rails-to_param将斜杠更改为“%2F”,可以覆盖它吗?

时间:2018-07-09 03:16:08

标签: ruby-on-rails ruby routes ruby-on-rails-5 ancestry

我使用的是祖先宝石,并试图构建路线以显示父母与子女之间的等级。

Location.rb

def to_param
  if self.ancestors?
    get_location_slug(parent_id) + "/" + "#{slug}"
  else
    "#{slug}"
  end
end

def get_location_slug(location_id)
  location = Location.find(location_id)
  "#{location.slug}"
end

这可以正常工作99%,并且可以清晰地显示我的路线-但在与父级的路线中,它显示的是“%2F”而不是“ /”:

localhost:3000/locations/location-1 (perfect)
localhost:3000/locations/location-1%2Flocation-2 (not quite perfect)

Routes.rb (以防万一)

match 'locations/:id' => 'locations#show', :as => :location, :via => :get
match 'locations/:parent_id/:id' => 'locations#show', as: :location_child, via: :get

奖金问题:目前,该问题涉及 root 位置和 child 位置。如何将其扩展到孙子位置和大孙子位置?预先感谢!

1 个答案:

答案 0 :(得分:0)

只想分享我的解决方案,希望能对某人有所帮助。

首先,我清理了模型中的方法:

def to_param
  slug
end

然后,调整我的路线:

get 'locations/:id', to: 'locations#show', as: :location
get 'locations/:parent_id/:id', to: 'locations#show_child', as: :location_child

然后,我在应用程序助手中创建了一个新方法,以为有/没有父母的位置生成这些URL:

def get_full_location_path(location)
  if location.ancestors?
    location_child_path(location.root, location)
  else
    location_path(location)
  end
end

最后,在我看来,我只是调用助手方法来生成正确的URL:

<%= link_to location.name, get_full_location_path(location) %>

这似乎工作得很好,但是我的下一个任务是将其扩展到祖父母和曾祖父母。任何建议表示赞赏!