鉴于资源事件,我希望{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
。
答案 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示例中提供的完全相同的行为。