在rails中的text_field上设置一些验证

时间:2014-05-05 06:54:31

标签: ruby-on-rails validation

我想要text_field,我想在此设置3 validation。在这text_field我得到了记者的电话号码。每位记者has_one reporterprofile。我想当记者输入他的phone_number时,我检查validates_numericality_ofvalidates_length_of如果这两个都是真的,那么检查uniqueness validation,如果这个phone_number是新的,那没关系,我通过此新reporterprofile创建redirect_toreporterprofile id,但如果此phone_number存在,我希望页面为redirect_to此{{ 1}}没有创建新的记者。

reporterprofile

reporter.rb

class Reporter < ActiveRecord::Base has_one :reporterprofile before_create :build_reporterprofile validates :phone_number, uniqueness: true validates_numericality_of :phone_number validates_length_of :phone_number, :minimum => 11, :maximum => 11 end

reporters_controller.rb

我可以def create @reporter = Reporter.new(reporter_params) respond_to do |format| if @reporter.save format.html { redirect_to edit_reporterprofile_path(:id => @reporter.reporterprofile), notice: 'Reporter was successfully created.' } format.json { render action: 'show', status: :created, location: @reporter } else if format.html { render action: 'new' } format.json { render json: @reporter.errors, status: :unprocessable_entity } end end end end redirect_to edit_reporterprofile_path无法保存,但如果我执行此操作,则reporternumerically验证不会检查。我怎样才能length他的个人资料中存在的记者?

2 个答案:

答案 0 :(得分:0)

我首先填充validates方法,而不是现在的方法。这将消除对您拥有的其他两种方法的依赖性,这应该解决一些问题:

validates :phone_number,
   length: { is: 6 },
   numericality: true,
   uniqueness: true

答案 1 :(得分:0)

首先,检查是否存在具有给定电话号码的Reporter。如果是这样,请重定向到reporterprofile路径。否则,创建新的记者。有各种方法可以组织逻辑来处理这个问题。在这里,所有这些都被推到了记者控制者的“创造”行动中。

def create
    existing_reporter = Reporter.includes(:reporterprofile).find_by(phone_number: reporter_params[:phone_number])
    if existing_reporter
      redirect_to reporterprofile_path(existing_reporter.reporterprofile)
    else
      @reporter = Reporter.new(reporter_params)

      respond_to do |format|
        if @reporter.save
          format.html { redirect_to edit_reporterprofile_path(:id => @reporter.reporterprofile), notice: 'Reporter was successfully created.' }
          format.json { render action: 'show', status: :created, location: @reporter }
        else
          if
            format.html { render action: 'new' }
            format.json { render json: @reporter.errors, status: :unprocessable_entity }
          end
        end
      end
    end
  end