-->

how validation is done using wicked?

2019-07-21 00:31发布

问题:

I have a users_controller and a user_steps_controller which has three steps :business, :payment and :login

In the user.rb model

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

while checking validation if i put some random values then also it is giving errors

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

Please help me out

This is my 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

回答1:

Your real problem is here:

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

I'm assuming params[:id] is nil, because otherwise that would fail. Basically, your instantiating a User with no data supplied and trying to save it. So clearly those validations you have supplied will fail. If you're actually submitting a form with user data you need to pass user_params you've already defined as follows:

@user = User.new(user_params)

If you need to have validations occur on your User model in different steps, you'll need to have the validations run conditionally dependent on the state of the form:

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


回答2:

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

This method will work for you.