【问题标题】:how validation is done using wicked?如何使用 wicked 进行验证?
【发布时间】:2015-05-21 12:38:14
【问题描述】:

我有一个 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

用户.rb

类用户<: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

【问题讨论】:

  • 您可能需要发布一些用于测试验证的表单代码。
  • 请发布您的控制器代码,触发用户创建
  • 我发布了 users_controller @Stanislav

标签: ruby-on-rails ruby-on-rails-3 wicked-pdf


【解决方案1】:

用户.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

这个方法对你有用。

【讨论】:

  • 现在第一页工作正常,但在其他步骤中没有显示验证@user123
  • 添加了 user.rb @user123
  • 如何从 user_steps_controller 设置 current_step?
  • 我已经尝试过了,它正在工作。你遇到了什么错误?
  • 我没有在 user_steps 上得到验证
【解决方案2】:

你真正的问题在这里:

@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

【讨论】:

  • 但是如果我在第一页而不进行下一步操作,现在下一步验证错误就会出现......请帮助我解决这个问题@faraz
  • 不幸的是,我现在需要睡觉了。发布另一个问题的详细信息,希望其他人可以提供帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多