如何使用邪恶进行validation?

我有一个users_controller和一个user_steps_controller,它有三个步骤:business,:payment和:login

在user.rb模型中

class User < ActiveRecord::Base validates_presence_of :fname, :lname, :email, :mob, :country, :state, :suburb, :postal ,:add end 

在检查validation时,如果我放置一些随机值,那么它也会给出错误

 Fname can't be blank Lname can't be blank Email can't be blank Mob can't be blank Country can't be blank State can't be blank Suburb can't be blank Postal can't be blank Add can't be blank 

请帮帮我

这是我的users_controller

  def new @user = User.new end def create @user = User.new(params[:id]) if @user.save session[:user_id]= @user.id @user.update_attributes(user_params ) redirect_to user_steps_path else render :new end end private def user_params params.require(:user).permit( :fname, :lname, :email, :mob, :gender_male, :gender_female, :country, :state, :suburb, :postal ,:add, :cmpyname, :abnacn, :cmpyadd, :cmpydet,:cash, :paypal,:bsb,:usrname,:password_hash, :password_salt, :selcat, :protit, :prodes) end 

user.rb

class User <ActiveRecord :: Base

 validates :fname, :lname, :email, :mob, :country, :state, :suburb, :postal ,:add, :presence => true attr_accessor :current_step validates_presence_of :cmpyname, :abnacn, :cmpyadd, :cmpydet, if: -> { current_step?(:business) } validates_presence_of :usrname,:password_hash, :password_salt, :selcat, :protit, :prodes, if: -> { current_step?(:login) } def current_step?(step_key) current_step == step_key end end 

user_steps_controller

 class UserStepsController < ApplicationController include Wicked::Wizard steps :business, :login, :payment def show @user = current_user render_wizard end def update @user = current_user params[:user][:current_step] = step @user.update_attributes(user_params ) render_wizard @user end private def user_params params.require(:user).permit( :cmpyname, :abnacn, :cmpyadd, :cmpydet,:cash, :paypal,:bsb,:usrname,:password_hash, :password_salt, :selcat, :protit, :prodes) end end 

你真正的问题在这里:

 @user = User.new(params[:id]) 

我假设params[:id] nil ,因为否则会失败。 基本上,您实例化没有提供数据的User并尝试保存它。 很明显,您提供的validation将失败。 如果您实际提交的是包含用户数据的表单,则需要传递user_params您已经定义如下:

@user = User.new(user_params)

如果您需要在不同的步骤中对用户模型进行validation,则需要根据表单的状态有条件地运行validation:

 class User attr_accessor :current_step validates_presence_of :business_related_attr, if: -> { current_step?(:business) } def current_step?(step_key) current_step.blank? || current_step == step_key end end 

user.rb

 def current_step?(step_key) current_step == step_key end 

user_steps_controller.rb

 class UserStepsController < ApplicationController include Wicked::Wizard steps :personal, :social def show @user = current_user render_wizard end def update @user = current_user params[:user][:current_step] = step @user.attributes = user_params render_wizard @user end private def redirect_to_finish_wizard(options = nil) redirect_to root_url, notice: "Thank you for signing up." end def user_params params.require(:user).permit(:name, :current_step, :date_of_birth, :bio, :twitter_username, :github_username, :website) end end 

这种方法对你有用。