【问题标题】:Display flash message with model validations显示带有模型验证的闪存消息
【发布时间】:2015-08-04 15:20:50
【问题描述】:

我有以下模型验证...

  validates :event_id, :uniqueness => {:scope => :email}
  validates_format_of :email, :with => /\A[^@]+@([^@\.]+\.)+[^@\.]+\z/
  validates_presence_of :email, :first_name, :last_name

..这是我的控制器...

def register_learner
    @event = Event.find(params[:event_id])
    begin
      EventRegistration.create! first_name: params[:first_name], last_name: params[:last_name], email: params[:email], event_id: params[:event_id]
      rescue ActiveRecord::RecordInvalid => e
    end
end

此代码有效,但问题是它会默默地捕获错误。我想在当前页面中向用户显示一条消息。所以我尝试了这个......

   def register_learner
    @event = Event.find(params[:event_id])
    begin
      @registation = EventRegistration.create! first_name: params[:first_name], last_name: params[:last_name], email: params[:email], event_id: params[:event_id]
      rescue ActiveRecord::RecordInvalid => e
      if !@registation.valid?
        flash[:notice] = @registation.errors
      end
    end
   end

...但是如果验证失败,我会收到消息undefined method `valid?' for nil:NilClass

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 validation flash-message


    【解决方案1】:

    如果您使用new 而不是create!,您最终会得到一个可以告诉您valid? == false 的实例。

    在这种情况下你也不需要救援。

    所以你可以这样做:

    def register_learner
      @event = Event.find(params[:event_id])
      @registation = EventRegistration.new(
        first_name: params[:first_name], 
        last_name: params[:last_name], 
        email: params[:email], 
        event_id: params[:event_id]
      )
      flash[:notice] = @registation.errors unless @registation.valid?
    end
    

    另外,如果您可能已经有一个现有的注册,您可以使用find_or_initialize_by,然后使用@registration.new_record? 检查生成的对象是否是新记录。

    【讨论】:

      【解决方案2】:

      谢谢乍得_。那是票。对于一个完整的解决方案,这就是我所做的......

      def register_learner
          @event = Event.find(params[:event_id])
          @registation = EventRegistration.new first_name: params[:first_name], last_name: params[:last_name], email: params[:email], event_id: params[:event_id]
          if !@registation.valid?
            flash[:notice] = @registation.errors.full_messages.to_sentence
            redirect_to(event_path(@event))
          else
            @registation.save
          end
      end
      

      【讨论】:

      • 没问题。您错过了end。 ;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 2020-01-19
      相关资源
      最近更新 更多