验证失败时重定向到操作

时间:2013-12-05 19:02:40

标签: ruby-on-rails validation

Good Afternoon All,

我正在试图找出如何阻止用户离开编辑页面,包括点击其他链接,直到user.valid?

有没有人知道在模型中执行此操作的方法。仅供参考,目前是带有验证的模型。

  #validations for common attributes

     validates :email, presence: true, on: :create, uniqueness: true,
               :format => /@/
     validates :password, presence: true, on: :create, length: {minimum: 6}

     #validations blocks for dev

    with_options :if => lambda { |o| o.role_type == "developer" } do |dev|
      dev.validates :first_name, presence: true, on: :update
      dev.validates :last_name, presence: true, on: :update
      dev.validates :LANGUAGES, presence: true, on: :update
      dev.validates :dev_desc, presence: true, on: :update
      dev.validates :github, presence: true, on: :update, 
                    :format => URI::regexp(%w(http https github))
      dev.validates :stackoverflow, presence: true, on: :update, 
                    :format => URI::regexp(%w(http https stackoverflow))
      dev.validates :level, presence: true, on: :update
       dev.validates :street, presence: true, on: :update
       dev.validates :city, presence: true, on: :update
       dev.validates :state, presence: true, on: :update
       dev.validates :postcode, presence: true, on: :update
    end

    #validations block for employer

    with_options :if => lambda { |o| o.role_type == "employer" } do |e|
        e.validates :company_name, presence: true, on: :update,
                    uniqueness: true
        e.validates :employer_desc, presence: true, on: :update
        e.validates :area_of_focus, presence: true, on: :update
        e.validates :number_of_employees, presence: true, on: :update
     e.validates :street, presence: true, on: :update
     e.validates :city, presence: true, on: :update
     e.validates :state, presence: true, on: :update
     e.validates :postcode, presence: true, on: :update
    end

也许是一个after_validation钩子,但我不确定,想要一些建议。

更新:在应用程序控制器中尝试使用以下内容但挂钩到所有页面,我将如何仅为用户分配方法。

  def check_valid
    if current_user.valid? == false 
       render :action => :edit
       else
      jobs_path
    end
  end

2 个答案:

答案 0 :(得分:0)

一种方法是,当成员进入编辑页面时,您在其会话中设置一个变量member_on_edit = true,并且您需要通过JS提交表单以更改编辑表单的任何元素并存储当前表单状态进入会议。

这样,您就可以在before_filter中放置ApplicationController,将成员重定向到编辑页面,并使用会话中存储的数据填充表单元素。

会话结构状态有效且会员点击“提交”后,您可以设置member_on_edit = false并阻止进一步过度重定向到编辑表单。

答案 1 :(得分:0)

好的,为了解决这个问题,我采用了@dosadnizub提到的想法并将其放在我的应用程序控制器中。

def check_privileges!
  redirect_to "/users/edit" unless current_user.valid?
end

然后我在相关控制器中使用它来阻止用户转义编辑页面。尚未完全测试它,但现在运作良好:

 before_filter :check_privileges!, only: [:new, :create]