2009-01-08 36 views
16

Tôi có một mô hình đường ray xác nhận tính duy nhất của 2 giá trị biểu mẫu. Nếu 2 giá trị này không phải là duy nhất thì lỗi xác thực được hiển thị và nút "gửi" được thay đổi thành "gửi lại". Tôi muốn cho phép người dùng nhấp vào nút "gửi lại" và bỏ qua xác thực mô hình. Tôi muốn làm một cái gì đó như thế này từ tài liệu ray xác nhận:Rails hình thức xác nhận bỏ qua có điều kiện

validates_uniqueness_of :value, :unless => Proc.new { |user| user.signup_step <= 2 }

nhưng tôi không có aa giá trị trong mô hình của tôi mà tôi có thể kiểm tra ... chỉ là params có giá trị "Gửi lại".

Bất kỳ ý tưởng nào về cách thực hiện việc này?

Trả lời

39

Theo tôi đây là cách tốt nhất để làm điều đó:

class FooBar < ActiveRecord::Base 
    validates_uniqueness_of :foo, :bar, :unless => :force_submit 
    attr_accessor :force_submit 
end 

sau đó theo quan điểm của bạn, hãy chắc chắn bạn đặt tên nộp thẻ như

<%= submit_tag 'Resubmit', :name => 'foo_bar[force_submit]' %> 

cách này, tất cả logic là trong mô hình, mã điều khiển sẽ giữ nguyên.

+0

điều này giống như chính xác những gì tôi muốn làm. Tôi sẽ thử nó ngay hôm nay khi tôi đi làm. – hacintosh

+0

đã cảm ơn rất nhiều !!! – hacintosh

+2

nếu bạn đang sử dụng Devise và bạn không muốn thay đổi dạng xem, bạn có thể ghi đè RegistrationsController để đặt foobar [force_submit] trong params trước khi gửi nó lên Devise :: RegistrationsController. Đừng quên đặt 'attr_accessible: force_submit' trong mô hình (Rails 3.x) hoặc force_submit sẽ không được cập nhật. –

9

Hãy thử điều này:

Rails 2: Model.save(false)
Rails 3: Model.save(:validate => false)

Nó bỏ qua kiểm chứng thực (tất cả trong số họ mặc dù).

+1

Tiêu đề của tôi là loại gây hiểu nhầm ... Tôi không muốn hoàn toàn bỏ qua tất cả các xác thực của tôi, chỉ 2 validates_uniqeness_of – hacintosh

+1

Chỉ cần tình cờ khi điều này. Bạn nên sử dụng 'object.save (: validate => false)' khi sử dụng Rails 3. –

+0

Điểm tốt Jaap, tôi đã gửi chỉnh sửa để thêm vào câu trả lời. – junky

2

Không tích cực về điều này, nhưng bạn có thể thử thêm attr_accessor vào mô hình của mình để giữ cho dù biểu mẫu đã được gửi một lần trước đó chưa.

chỉ cần thêm

attr_accessor :submitted

để mô hình của bạn và kiểm tra nó trong kiểm chứng thực của bạn.

1

Bạn chỉ có thể xem nút gửi để xác định xem bạn có muốn thực hiện xác thực hay không.

def form_method 
    case params[:submit] 
    when "Submit" 
     'Do your validation here' 
    when "Resubmit" 
     'Do not call validation routine' 
    end 
end 
Các vấn đề liên quan