PENGZhaoqing / CourseSelect

校园选课系统样本 (a template for course selection system by Ruby on Rails)
https://courseselect.herokuapp.com/
MIT License
105 stars 206 forks source link

修改密码跳转页面问题 #55

Closed WangZhefeng93 closed 7 years ago

WangZhefeng93 commented 7 years ago

/app/controllers/sessions_controller.rb

class SessionsController < ApplicationController
  include SessionsHelper

  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      if user.first == true #如果已经修改过密码
      log_in user
      params[:session][:remember_me] == '1' ? remember_user(user) : forget_user(user)
      flash= {:info => "欢迎回来: #{user.name} :)"}
      redirect_to root_url, :flash => flash
      else
        redirect_to "/users/#{user.id}/changepass"
      end
    else
      flash= {:danger => '账号或密码错误'}
    end

  end

  def new

  end

  def destroy
    log_out if logged_in?
    redirect_to root_url
  end

end
PENGZhaoqing commented 7 years ago

贴代码,我不好编辑

WangZhefeng93 commented 7 years ago

/app/controllers/users_controllers.rb

class UsersController < ApplicationController
  before_action :logged_in, only: :update
  before_action :correct_user, only: [:update, :destroy]

  def new
    @user=User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to root_url, flash: {success: "新账号注册成功,请登陆"}
    else
      flash[:warning] = "账号信息填写有误,请重试"
      render 'new'
    end
  end

  def edit
    @user=User.find_by_id(params[:id])
  end

  def changepass
    @user =User.find_by_id(params[:id])
  end
  def changefirst
    @user = User.find_by_id(params[:id])
    @user.update_attribute("first",true)
    @user.update_attribute("password",params[:password])
    redirect_to root_url

  end

  def update
    @user = User.find_by_id(params[:id])
    if @user.update_attributes(user_params)
      flash={:info => "更新成功"}
    else
      flash={:warning => "更新失败"}
    end
    redirect_to root_path, flash: flash
  end

  def destroy
    @user = User.find_by_id(params[:id])
    @user.destroy
    redirect_to users_path(new: false), flash: {success: "用户删除"}
  end

#----------------------------------- students function--------------------

  private

  def user_params
    params.require(:user).permit(:name, :email, :major, :department, :password,
                                 :password_confirmation)
  end

  # Confirms a logged-in user.
  def logged_in
    unless logged_in?
      redirect_to root_url, flash: {danger: '请登陆'}
    end
  end

  # Confirms the correct user.
  def correct_user
    @user = User.find(params[:id])
    unless current_user?(@user)
      redirect_to root_url, flash: {:warning => '此操作需要管理员身份'}
    end
  end

  # Confirms a logged-in user.
  def teacher_logged_in
    unless teacher_logged_in?
      redirect_to root_url, flash: {danger: '请登陆'}
    end
  end

end
WangZhefeng93 commented 7 years ago

/app/views/users/changpass.html.erb

<div class="row">
  <div class="col-md-4 col-md-offset-4">
    <div class="panel panel-info">
      <div class="panel-heading">
        <h3 class="text-center">请修改邮箱及密码</h3>
      </div>
      <div class="panel-body">
        <%= form_for @user, url: {action: "changefirst"},method: :post, html: {class: 'form-horizontal', role: 'form'} do |f| %>
            <%= render 'shared/error_messages', :object => @user %>

            <div class="form-group">
              <%= f.label "姓名", class: 'col-sm-3 control-label' %>
              <div class="col-sm-9">
                <div class="input-group">
                  <div class="input-group-addon"><span class="glyphicon glyphicon-user"></span></div>
                  <%= f.label "#{@user.name}", class: 'form-control' %>
                </div>
              </div>
            </div>

            <div class="form-group">
              <%= f.label "用户名", class: 'col-sm-3 control-label' %>
              <div class="col-sm-9">
                <div class="input-group">
                  <div class="input-group-addon"><span class="glyphicon glyphicon-envelope"></span></div>
                  <%= f.email_field :email, class: 'form-control', placeholder: "输入有效的邮箱" %>
                </div>
              </div>
            </div>

            <div class="form-group">
              <%= f.label "专业", class: 'col-sm-3 control-label' %>
              <div class="col-sm-9">
                <div class="input-group">
                  <div class="input-group-addon"><span class="glyphicon glyphicon-home"></span></div>
                  <%= f.label "#{@user.major}", class: 'form-control' %>
                </div>
              </div>
            </div>

            <div class="form-group">
              <%= f.label "培养单位", class: 'col-sm-3 control-label' %>
              <div class="col-sm-9">
                <div class="input-group">
                  <div class="input-group-addon"><span class="glyphicon glyphicon-home"></span></div>
                  <%= f.label "#{@user.department}", class: 'form-control' %>
                </div>
              </div>
            </div>

            <div class="form-group">
              <%= f.label "新密码", class: 'col-sm-3 control-label' %>
              <div class="col-sm-9">
                <div class="input-group">
                  <div class="input-group-addon"><span class="glyphicon glyphicon-lock"></span></div>
                  <%= f.password_field :password, class: 'form-control', placeholder: "输入密码" %>
                </div>
              </div>
            </div>

            <div class="form-group">
              <%= f.label "确认密码", class: 'col-sm-3 control-label' %>
              <div class="col-sm-9">
                <div class="input-group">
                  <div class="input-group-addon"><span class="glyphicon glyphicon-lock"></span></div>
                  <%= f.password_field :password_confirmation, class: 'form-control', placeholder: "再次输入密码" %>
                </div>
              </div>
            </div>

            <%= f.submit '确定', class: "btn btn-primary btn-block" %>
            <%= link_to '取消', root_path, :class => "btn btn-default btn-block" %>

        <% end %>

      </div>
    </div>
  </div>

</div>
PENGZhaoqing commented 7 years ago

前面标出来文件名和路径

PENGZhaoqing commented 7 years ago

错误呢

WangZhefeng93 commented 7 years ago

error

PENGZhaoqing commented 7 years ago

这个错误是由于登录的视图form_for有误,你找到那个文件贴上来

WangZhefeng93 commented 7 years ago

/app/views/sessions/new.html.erb

<div class="row">
  <div class="col-sm-offset-4 col-sm-4">
    <div class="panel panel-success">
      <div class="panel-heading">
        <h4><span class="glyphicon glyphicon-lock"></span> 登录</h4>
      </div>
      <div class="panel-body">

        <%= form_for(:session, url: sessions_login_path, method: :post, html: {role: 'form'}) do |f| %>
            <div class="form-group">
              <%= f.label :email, "账号密码登陆" %>
              <div class="input-group">
                <div class="input-group-addon"><span class="glyphicon glyphicon-envelope"></span></div>
                <%= f.email_field :email, class: 'form-control', placeholder: "输入邮箱" %>
              </div>
            </div>

            <div class="form-group">
              <div class="input-group">
                <div class="input-group-addon"><span class="glyphicon glyphicon-lock"></span></div>
                <%= f.password_field :password, class: 'form-control', placeholder: "输入密码" %>
              </div>
            </div>

            <div class="checkbox">
              <label><%= f.check_box :remember_me %>记住我</label>
            </div>

            <%= button_tag(type: "submit", class: "btn btn-success btn-block") do %>
                <span class="glyphicon glyphicon-off"></span>登陆
            <% end %>

        <% end %>
      </div>

      <div class="panel-footer">
        <p>没有账号?
          <%= link_to "注册", new_user_path %>
        </p>
      </div>
    </div>
  </div>
</div>
PENGZhaoqing commented 7 years ago

登录这块你改啥了,怎么会这样

WangZhefeng93 commented 7 years ago

我只是在登录时执行的sessions_controller中create方法中加入了是否是第一次的登录的判断。如果是第一次登陆,那么要redirect_to到changepass页面,在这个页面修改密码,使表单提交到changfirst方法中,处理这个表单更新数据库。更新完成后redirect_to到主页重新登录啊。结果就是在重新登录的过程中给我提示这个无效哈希的错误啊

PENGZhaoqing commented 7 years ago

能不能先简化一下,不要changepass试试,只加一个视图看看

WangZhefeng93 commented 7 years ago

好的,我先去试一下,谢谢助教