【问题标题】:Devise with Rails Not Creating Users Properly使用 Rails 设计时无法正确创建用户
【发布时间】:2016-05-26 20:35:58
【问题描述】:

我是 Rails 初学者,我正在尝试创建一个带有注册页面的网站,该页面在我设置的数据库中创建用户。我(似乎)正确安装了设计,在创建第一个用户对其进行测试后,一切似乎都正常。但是,如果我尝试创建另一个用户,它就不起作用。在页面上单击创建用户后,它会返回主页,没有任何错误或任何东西。但是当我检查数据库中的用户表时,我可以看到用户没有被创建。

当我将第一个用户 id(主键)从 2 更改为 1 时,我让它工作了。新用户的 id 是 3。所以看起来无论出于何种原因,设计想要跳过一个步骤,或者不知何故试图插入两次或什么的。但是再一次,即使在我让新用户创建之后,如果我再试一次,它也不起作用。

这是创建请求期间rails服务器的打印输出:

Started POST "/users" for ::1 at 2016-05-26 16:08:26 -0400
Processing by RegistrationsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"zl39rAOLLSRoEZUIcX574BlJtNgySlz/d5FRNIg3ZjuvcdQJxOVLDdWPAp3jQqhT3g1H0PCexFdHdmAQD81CKQ==", "user"=>{"first_name"=>"asdasd", "last_name"=>"asdasd", "email"=>"asdasd@asda.com", "password"=>"[FILTERED]", "confirm_password"=>"[FILTERED]"}, "instructor"=>"1", "commit"=>"Create my account"}
  User Load (0.5ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 4  ORDER BY `users`.`id` ASC LIMIT 1
Redirected to http://localhost:3000/
Filter chain halted as :require_no_authentication rendered or redirected
Completed 302 Found in 39ms (ActiveRecord: 0.5ms)

这是我的 UsersController 文件:

class UsersController < ApplicationController

  def index
    @users = User.all
  end

  def show
    @user = User.find(params[:id])
  end

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

  def new
    @user = User.new
    @user.active = 1
  end

   def create
     @user = User.new(sign_up_params)    # Not the final implementation!
     if @user.save
       redirect_to :action => :index
     else
       render 'signup'
     end
   end

  def destroy
    @user = User.find(params[:id]).destroy
    if @user.destroy
      redirect_to users_path
    else
      render 'index'
    end
  end

 private

   def user_params
     params.require(:user).permit(:first_name, :last_name, :email, :instructor, :active)
   end

end

这是我的 new.html.erb 文件:

<h1>New User</h1>

<%= render 'form' %>

<%= link_to 'Back', users_path %>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(@user) do |f| %>
      <%= f.label :first_name %>
      <%= f.text_field :first_name %>

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

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

      <%= check_box_tag(:instructor) %>
        <center><%= label_tag(:instructor, "I want to be an instructor") %></center>
      <br>
      <br>
      <%= f.label :password %>
      <%= f.password_field :password %>

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

      <%= f.submit "Create my account", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>

感谢您提供的任何帮助

【问题讨论】:

  • 提交时是否登录?如果您是,设计方法require_no_authentication 将重定向您。
  • Devise 的全部意义在于它为视图、控制器等的身份验证提供了现成的解决方案。如果您想作为初学者学习如何制作身份验证系统,请不要从破解 Devise 开始.代码非常复杂,因为它需要具有疯狂的灵活性。相反,请查看 railstutorial.org 之类的内容
  • Devise 创建用户后会自动登录吗?

标签: ruby-on-rails ruby ruby-on-rails-3 devise


【解决方案1】:

Devise 不允许您在以用户身份登录时创建新用户。如果您需要此功能(在登录时通过您的 Web 应用程序添加用户)并且不想从 rails 控制台添加用户,您将不得不像下面这样进行设计:

创建用户控制器:rails g controller Users 然后在您的路线中,您必须指定:

  devise_for :users, controllers: { sessions: "users/sessions" }
  resources :users_crew, :controller => 'users'

然后在您的新用户控制器中,您可以做您想做的事情,例如:

    class UsersController < ApplicationController

  before_action :admin?, except: [:index]

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      flash[:success]="User added"
      redirect_to root_path
    else
      flash[:error]="Something went wrong, please try again"
      render 'new'
    end
  end

  def index

  end

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

  def update
    @user = User.find(params[:id])
   if @user.update_attributes(user_params)
      flash[:success]="User and oversight updated"
      redirect_to root_path
    else
      flash[:error]="Something went wrong, please try again"
      render 'new'
    end
  end

  def destroy
     @user = User.find(params[:id])
    if @user.destroy
      flash[:success] = "The user account has been deleted."
      redirect_to root_path
    else
      flash.now[:error] = "Sorry, user record was not changed."
      redirect_to root_path
    end
  end


  private

  def user_params
    params.require(:user).permit(:email, :first_name, :password, :password_confirmation) 
  end

end

这基本上告诉 Devise 我们只在会话中需要它。 users_crew 资源指向 User 控制器,因此我们可以在那里添加我们的自定义逻辑,而不必担心在此过程中破坏 Devise。确保向 User.create 方法提供密码和密码确认属性,因为 Devise 仍将处理注册等。

最后,请记住,如果您使用我上面的路线,您的用户路线现在将类似于“users_crew_path”等。如果不确定,请键入 bundle exec rake routes 以获取您设置的所有路线及其助手的完整列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 2018-06-08
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多