如何使用 wicked 完成验证?
how validation is done using wicked?
我有一个 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
在检查验证时,如果我输入了一些随机值,那么它也会给出错误
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 用户 < 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
并尝试保存它。很明显,您提供的那些验证将失败。如果您实际上是在提交包含用户数据的表单,则需要传递 user_params
您已经定义如下:
@user = User.new(user_params)
如果您需要在不同的步骤中对用户模型进行验证,则需要根据表单的状态有条件地进行验证运行:
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
这个方法适合你。
我有一个 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
在检查验证时,如果我输入了一些随机值,那么它也会给出错误
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 用户 < 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
并尝试保存它。很明显,您提供的那些验证将失败。如果您实际上是在提交包含用户数据的表单,则需要传递 user_params
您已经定义如下:
@user = User.new(user_params)
如果您需要在不同的步骤中对用户模型进行验证,则需要根据表单的状态有条件地进行验证运行:
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
这个方法适合你。