如何允许从我的应用中的两个不同位置登录?

时间:2014-09-10 01:07:58

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

我的应用允许用户从两个不同的位置登录,即标题和新会话页面。新会话页面将用户登录并将其重定向到正确的页面,但主页只是重新加载主页而不重定向用户或将其登录。

这是我的sessionscontroller.rb

class SessionsController < ApplicationController

  def new
  end

  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      session[:user_id] = user.id
      redirect_back_or feed_user_path(user)
    else
      session[:user_id] = nil
      flash.now[:error] = 'Invalid email/password combination'
      render 'new'
    end
  end

  def destroy
    session[:user_id] = nil
    redirect_to root_url
  end
end

new.html.erb

    <%= form_for(:session, url: sessions_path) do |f| %>

      <%= f.label :email %>
      <%= f.text_field :email %>

      <%= f.label :password %>
      <%= f.password_field :password %>

      <%= f.submit "Log in", class: "btn btn-large btn-info" %>
    <% end %>

我的_header.html.erb中的代码

<%= form_for :session, :url => {:controller => "sessions", :action => "new"} do |f| %>
   <div class="home-login form-group">
<%= f.label :email %>
<%= f.text_field :email, :placeholder => "Email" %>
    </div>
  <div class="home-login form-group">
<%= f.label :password %>
<%= f.password_field :password, :placeholder => "Password" %>
  </div>
<div class="form-group home-login">
<%= f.submit "Log in", class: "btn-info" %>
  </div>
<% end %>

这是终端中显示的内容

  

---!ruby / hash:ActionController :: Parameters   utf8:✓   authenticity_token:AegIbI8c1TIddIBPVWTt / B2CBoCAgbJxL + NWDe782Cc =   session:!ruby / hash:ActiveSupport :: HashWithIndifferentAccess     电子邮件: ** @ **     密码:****   提交:登录   控制器:页面   行动:回家

EDIT ****

这是我的应用程序控制器

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  include SessionsHelper
end

Home是我的页面控制器中的静态页面

class PagesController < ApplicationController

  def home
  end
end

EDIT ****

这是我的SessionsHelper

module SessionsHelper

  def signed_in?
    !!session[:user_id]
  end

  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end

  def current_user=(user) # set current user
    @current_user = user # session[:user_id] = user.id
  end

  def current_user?(user) # get current user
    user == current_user
  end

  def signed_in_user
    unless signed_in?
      store_location
      redirect_to signin_url, notice: "Please sign in."
    end
  end

  def redirect_back_or(default)
    redirect_to(session[:return_to] || default)
    session.delete(:return_to)
  end
end

EDIT ****

路线

sessions POST   /sessions(.:format)                   sessions#create

new_session GET    /sessions/new(.:format)               sessions#new

session DELETE /sessions/:id(.:format)               sessions#destroy

3 个答案:

答案 0 :(得分:0)

尝试更改form_for标记,使用post方法将其指向create动作。像这样的东西:

<%= form_for :session, url: session_path, method: 'post', action: 'create' do |f| %>

答案 1 :(得分:0)

除非您在那里引用任何特定于控制器的数据,否则您在何处放置登录表单没有区别。我没有看到,所以你应该好好复制完全相同的form_for调用,实际产生工作结果。至少我没有看到任何阻止这样做的事情。

问题在于行动。 new。错误。它是create。 “New”是表单的显示页面(并因此使用GET),实际表单的操作(数据发送路径)是“create”(使用POST)。从路由中挑选HTTP方法,执行rake routes以验证它们是否正确。

表单未绑定到它所在的页面。相反,它有自己的路径,应接受表单中的输入数据。

答案 2 :(得分:0)

我明白了。 ERB表单包装在HTML表单中。这导致了这个问题。