0

我最近使用 /signin 和 /signup 路径在我的 Rails 应用程序(到文件夹 public/index.html)上实现了一个新主页(index.html)。在我的网站上实现 index.html 之前,我一直在登录或注册后将用户重定向到 root_url(即 home.html.erb)。当他们退出时,我一直将他们重定向到 root_path。

问题是在这个新的 index.html 之后,当用户尝试登录或注册时,他们会被重定向回 index.html。有没有地方可以让他们成功登录到原始的 root_url 而无需进行许多代码编辑?

class SessionsController < ApplicationController

  def new
  end

  def create
    user = User.find_by_email(params[:session][:email])
    if user && user.authenticate(params[:session][:password])
      sign_in user
      redirect_to root_path
    else
      flash.now[:error] = "Invalid email/password combination"
      render 'new'
    end
  end

  def destroy
    sign_out
    redirect_to root_path
  end
end

用户控制器

def create
    @user = User.new(params[:user])
    if @user.save
      sign_in @user
      flash[:success] = "Welcome!"
      redirect_to root_path
    else
      render 'new'
    end
  end

这就是我在 routes.rb 中的内容

root to: 'static_pages#home'
4

4 回答 4

1

root_url首先, and之间的唯一区别root_path(通常在foo_urland之间foo_path)是前者是一个完整的 url(即http://example.com/...),而后者只是路径(主机名后面的位) . 对于简单的重定向,它们将具有相同的结果。

如果public/index.html存在,那么这就是访问“/”(即 root_path)的地方。

如果您希望用户在注册后被发送到不同的页面,请更改您的重定向。例如,如果您的路线文件有

get '/home' => 'home#index', :as => :home

然后重定向到home_path会将人们发送到家庭控制器的索引操作。

于 2013-03-17T22:35:30.967 回答
1

问题似乎是您public/index.html覆盖了root_pathRails 路线。

如果您的公共目录中root_path有一个文件被调用,您将无法访问。index.html

您需要重命名index.html为其他名称或使用您以外的其他路径root_path

编辑:

另一种选择是为 root_path 设置两个不同的 erb 模板。然后在 root_path 的控制器操作中,您可以这样做:

class StaticPages < ApplicationController
  def home
    if user_signed_in?
      render 'home_signed_in'
    else
      render 'home_signed_out'
    end
  end
end

然后,您需要在以下位置创建两个 erb 模板,

/app/views/static_pages/home_signed_in.html.erb

/app/views/static_pages/home_signed_out.html.erb

您还需user_signed_in?要用您自己的方法定义或替换我的示例代码中的方法,以检测用户是否已登录。不要忘记删除/public/index.html

于 2013-03-17T22:36:11.387 回答
0

转到您的 routes.rb 文件并进行以下更改

root :to => 'main#home_page'

您可以通过修改 root 重定向到任何路由:在 config/routes.rb 文件中

于 2013-03-18T23:20:57.933 回答
0

尝试更改root_pathhome_ControllerName_path,其中 ControllerName 必须是处理 home 操作的控制器的名称。

于 2013-03-17T22:33:06.260 回答