Rails redirect_to创建错误的URL

时间:2016-01-19 19:33:38

标签: ruby-on-rails ruby-on-rails-4 redirect controller

Haven找不到任何特定于此问题的内容(其他搜索涉及表格等)。对我而言,这可能是一个简单的疏忽。但到底是什么我错过了?

目标:如果会话存在,我只是尝试从/login网址重定向到/dashboard网址。

预期结果:致电redirect_to dashboard_index_urlredirect_to '/dashboard'应转至https://mydomain/dashboard

当前结果:如果我在创建会话后转到https://mydomain,则会将我重定向到https://mydomaindashboard,请注意缺少的斜杠

擅自解决方案:

  • 创建会话后手动键入网址https://mydomain/dashboard结果:有效,因此似乎存在正确的路由
  • routes.rb中设置手动路线,结果:行为与缺少斜线的resource路线完全相同
  • 清除浏览器缓存,使用不同的浏览器结果:都表现出相同的行为

这里有我所拥有的(缩写为相关部分):

class LoginController < ApplicationController
  def index
    redirect_to dashboard_index_url if session[:user_id]
  end
  #...
end

class DashboardController < ApplicationController
  before_action :require_login # calls redirect_to root_url unless session[:user_id]

  def index
    #...
  end
end

# In routes.rb:
resources :login
resources :dashboard
# have also tried things like (removed the above line for these)
get 'dashboard' => "dashboard#index"

@Ryan这是路线的当前输出:

$ rake routes Prefix Verb URI Pattern Controller#Action login_index GET /login(.:format) login#index POST /login(.:format) login#create new_login GET /login/new(.:format) login#new edit_login GET /login/:id/edit(.:format) login#edit login GET /login/:id(.:format) login#show PATCH /login/:id(.:format) login#update PUT /login/:id(.:format) login#update DELETE /login/:id(.:format) login#destroy dashboard GET /dashboard(.:format) dashboard#index dashboard_index GET /dashboard(.:format) dashboard#index POST /dashboard(.:format) dashboard#create new_dashboard GET /dashboard/new(.:format) dashboard#new edit_dashboard GET /dashboard/:id/edit(.:format) dashboard#edit GET /dashboard/:id(.:format) dashboard#show PATCH /dashboard/:id(.:format) dashboard#update PUT /dashboard/:id(.:format) dashboard#update DELETE /dashboard/:id(.:format) dashboard#destroy root GET / login#index

3 个答案:

答案 0 :(得分:3)

<强>解决:

好吧,我发现了问题,实际上并不是Rails,而是Apache-Passenger。有一个带有重定向的配置(以便所有HTTP被重定向到HTTPS)在apache级别没有浮动的斜杠并且导致麻烦。 (打了额头)

喜欢那些红色的鲱鱼。非常感谢你们的快速帮助!

答案 1 :(得分:1)

使用dashboard_index_url,您必须在路线文件中写入它。但是,当您在 routes.rb 信息中心资源中创建时,您可以使用 dashboards_url ,它会导致 / dashboards /索引

确定此任务的其他方法是创建映射

get 'dashboard' => "dashboard#index" as: :dashboard_index
将为您提供

dashboard_index_url dashboard_index_path

更新1

请查看SO question 问题是路径给你相对路线和网址 - 绝对。这就是为什么你的路径中没有额外的斜杠。尝试路径而不是网址,它应该有用。

更新2

尝试 dashboard_index_path

答案 2 :(得分:0)

如何将路线更改为

get '/login', to: redirect('/dashboard')

您甚至可以通过

将结果链接定制为更适合您用户的内容 如果您需要,请

get '/login', to: redirect('/dashboard'), as: '/dashboard/user[:username]'

另一方面,您应该尝试清理路线。那里有很多你没有使用的东西。将其更改为 resources :dashboard, only: [:index]并根据需要添加。 E.g only: [:index, :show]等。如果有一天需要另一位开发人员来修改您的应用,我们会查看您的路线,并可能对我们可以做的事情做出错误的假设。

贾斯汀