在Rails 5资源的show动作中创建自定义URL

时间:2017-07-10 19:55:08

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

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

示例:

如果您导航至https://stackoverflow.com/users/4180797,则加载后网址将自动变为https://stackoverflow.com/users/4180797/james-lowrey。对parameterize保持为真。所以" James Lowrey"将是4180797/any-other-txt-here列,在调用name后会变为james-lowrey

2 个答案:

答案 0 :(得分:1)

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

首先,在script

中添加以下show.html.erb
<script>
  $(document).ready(function() {
    history.pushState(null, null, "/events/<%= @event.id %>/<%= @event.name.parameterize %>");
  });
</script>

无论/:id之后发生什么,这都会改变每次加载的网址。

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

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

此选项还有一个额外的好处,即如果/:id之后的任何文字不匹配,则会避免重定向,只会获得id并替换之后的任何其他文本@event.name.parameterize url(没有任何重新加载)。

答案 1 :(得分:0)

好的,弄清楚这是非常棘手的,甚至不知道我之前可以访问很多这些变量。

首先修改您的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以重定向。

  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示例中提供的完全相同的行为。