如何解决强参数'编辑对象时出现矛盾?

时间:2015-07-19 16:32:20

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

我面临的问题很可能与强参数有关。问题是,当我尝试编辑某些用户信息并对其进行更新时,会出现与此表单无关的错误。这种错误应该只在注册或登录时弹出。

例如,这是我的数据库。然后点击“编辑”。

enter image description here

编辑完一些信息并提交后,会弹出错误。

enter image description here

控制器/ users_controller.rb

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      session[:user_id] = @user.id
      redirect_to [@user, @task], notice: "Thank you for signing up!"
    else
      render "new"
    end
  end

  def index
    @users = User.all
  end

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

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

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

    if @user.update(user_params)
      redirect_to @user
    else
      render 'edit'
    end
  end

  def destroy
    @user = User.find(params[:id])
    @user.destroy
    respond_to {|format| format.js }
  end

  private


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

视图/用户/ edit.html

<h1>Editing user</h1>

<%= form_for :user, url: @user, method: :patch do |f| %>

  <% if @user.errors.any? %>
    <div id="error_explanation">
      <h2>
        <%= pluralize(@user.errors.count, "error") %> prohibited
        this task from being saved:
      </h2>
      <ul>
        <% @user.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <p>
    <%= f.label :first_name %><br>
    <%= f.text_field :first_name %>
  </p>

  <p>
    <%= f.label :last_name %><br>
    <%= f.text_field :last_name %>
  </p>

  <p>
    <%= f.submit %>
  </p>
  <%= link_to 'Back to List', users_path %>

<% end %>

模型/ user.rb

class User < ActiveRecord::Base
  has_secure_password

   EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :first_name, presence: true,
            length: {maximum: 20}
  validates :last_name,  presence: true,
            length: {maximum: 40}
  validates :email, presence: true,
            format: {with: EMAIL_REGEX},
            uniqueness:  {case_sensitive: false}
  validates :password,
            length: {within: 6..40}

  has_many :tasks
end

我该怎么办?有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

strong params的问题是 。这是由于password上的 验证

validates :password,length: {within: 6..40}

应该是

validates :password,length: {within: 6..40}, on: :create

答案 1 :(得分:1)

是的,问题在于强烈的障碍。您永远不应该允许expr substr 'abacaba' 3 6password

password_confirmation

只需从def user_params params.require(:user).permit(:first_name, :last_name, :email) end 移除passwordpassword_confirmation即可。你不想大规模分配那些价值。

在数据库中存储普通密码是一种非常糟糕的做法。您应该在数据库中存储加密或散列密码;它可以增强应用程序的安全性和完整性。

要获取有关存储加密或哈希密码的详细信息,请查看thisthis个链接。