Rails 4:无法通过登录为用户创建会话,尽管会话是在创建新用户时创建的

时间:2016-11-22 09:44:26

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

我正在按照本教程创建一个非常基本的登录会话:https://www.youtube.com/watch?v=Hw6WtWJwRtU

跟着导师完全按照他的方式做了什么我遇到了很多错误,可能是因为他使用了较旧的Rails版本。所以现在的问题是,当我尝试登录系统时实际上并没有登录我,而在创建用户后,会话也被创建,一切正常。 这是我的应用程序布局,显示用户是否已登录

<!DOCTYPE html>
<html>
<head>
  <title>Fitit</title>
  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
  <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
  <%= csrf_meta_tags %>
</head>
<body>
  <% if current_user %>
  <p>
    Logges in as <%= current_user.username %>
    <%= link_to "Log out", logout_path %>
  </p>
  <% else %>
    <%= link_to "Sign Up", signup_path %>
    <%#= link_to "Set Profile", profile_path %>
    <%= link_to "Log In", login_path %>
  <% end %>

<%= yield %>

</body>
</html>

然后有一个创建新会话的视图(请注意这部分代码有很多问题:&lt;%#= form_tag session_path do%&gt; - 使用的导师,导致错误并要求输入:id,我试图传递几乎任何东西。

<h1>Log In</h1>

<%#= form_tag session_path do %>
<%= form_tag({controller: "sessions", action: "create"}, method: "get") do %>

  <div class="field">
    <%= label_tag :username %><br/>
    <%= text_field_tag :username, params[:username] %><br/>
  </div>
  <div class="field">
    <%= label_tag :password %><br/>
    <%= password_field_tag :password %><br/>
  </div>
  <div class="actions">
    <%= submit_tag "Log In" %>
  </div>

<% end %>

然后这是我的会话控制器

class SessionsController < ApplicationController
  def new
  end

  def create

    user = User.find_by_username(params[:username])
    respond_to do |format|
      if user && user.authenticate(params[:password])
        session[:user_id] = user.id
        format.html { redirect_to :index, notice: 'Logged In successfully' }
        format.json { render :index, status: :created, location: @session }
      else
        flash.now.alert = "Email or password is invalid"
        render "new"
      end
    end
  end

  def destroy
    session[:user_id] = nil

    respond_to do |format|
      format.html { redirect_to root_path, notice: 'Logged Out successfully' }
      format.json { head :no_content }
    end

  end

end

我认为问题所在。并且只是比较实际创建会话的用户控制器的CREATE方法。

def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        session[:user_id] = @user.id
        format.html { redirect_to @user, notice: 'User was successfully created.' }
        format.json { render :show, status: :created, location: @user }
      else
        format.html { render :new }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

路线:

Rails.application.routes.draw do

  resources :sessions
  resources :foods

  resources :users do
    resources :entries
  end

  post "log_in" => "sessions#new", :as => "log_in"
  get "logout" => "sessions#destroy", :as => "logout"
  get "login" => "sessions#new", :as => "login"
  get "signup" => "users#new", :as => "signup"

  root :to => 'users#new'

  get "app/views/users/profile.html.erb", to: "users#profile", as: "profile"
end

有谁知道我在这里做错了什么?我已经尝试在第二天解决这个问题了。

1 个答案:

答案 0 :(得分:0)

在form_tag上使用POST(默认值为1)而不是GET。

<%= form_tag({controller: "sessions", action: "create"}) do %>

因为在您的路由器文件中,行:

资源:会话

会产生类似的东西:

  

会话POST /sessions(。:format)sessions #create

     #...