【问题标题】:Creating a custom URL in Rails 5 Resource's show action在 Rails 5 Resource 的显示操作中创建自定义 URL
【发布时间】:2017-07-10 19:55:08
【问题描述】:

鉴于资源事件,我希望 /events/1 在输入时导航到 URL 栏中的 /events/1/column_name。在事件数据库迁移中,列名是 t.string :name。这个 column_name 需要在重定向之前调用 parameterize。关于如何完成这项工作的任何想法?

例子:

如果您导航到https://stackoverflow.com/users/4180797,URL 将在加载后自动变为https://stackoverflow.com/users/4180797/james-lowrey。对4180797/any-other-txt-here 成立。所以“James Lowrey”将是name 列,在其上调用parameterize 后将变为james-lowrey

【问题讨论】:

标签: ruby-on-rails controller url-routing


【解决方案1】:

另一种选择是将 pushState 与 javascript/jquery 一起使用,例如:

首先,在show.html.erb中添加以下script

<script>
  $(document).ready(function() {
    history.pushState(null, null, "/events/<%= @event.id %>/<%= @event.name.parameterize %>");
  });
</script>

无论/:id之后是什么,这都会改变每次加载时的url。

其次,修改路由以接受/:id之后的任何内容(并忽略它):

Rails.application.routes.draw do
  #...
  get "/events/:id/*other" => "events#show"
end

如果/:id 之后的任何文本不匹配,此选项还具有避免重定向的额外好处,它只会获取id 并将之后的任何其他文本替换为网址中的@event.name.parameterize(无需重新加载) .

【讨论】:

  • 很好的解决方案!这避免了重定向并节省了一些服务器处理。但是,如果用户禁用 JS,它将无法工作,因此需要进行一些权衡。感谢您的回答!
【解决方案2】:

好吧,这真的很难弄清楚,甚至不知道我之前可以访问很多这些变量。

首先编辑您的config/routes.rb 以接受id/other_stuff

Rails.application.routes.draw do
  resources :events
  get "/events/:id/*other" => "events#show" #if any txt is trailing id, also send this route to events#show
end

接下来修改event_controller.show,如果URL不正确则重定向。

  def show
    #redirect if :name is not seen in the URL
    if request.format.html? 
      name_param = @event.name.parameterize
      url = request.original_url
      id_end_indx = url.index(@event.id.to_s) + (@event.id.to_s).length + 1 #+1 for '/' character
      ##all URL txt after id does not match name.parameterize
      if url[id_end_indx..-1] != @event.name.parameterize
        redirect_to "/events/#{@event.id}/#{name_param}"
      end
    end
  end

这将导致与问题中给出的 Stack Overflow 示例完全相同的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    相关资源
    最近更新 更多