2010-08-25 32 views
7

Tôi có một biểu mẫu cho phép người dùng gửi thư đến email và tôi muốn thêm xác thực vào thư. Tôi không có một mô hình cho điều này, chỉ có một bộ điều khiển. Làm thế nào tôi nên làm điều này trong Rails?Xác thực trong Rails mà không có mô hình

Tôi đã cân nhắc thực hiện xác thực trong bộ điều khiển và hiển thị lỗi cho người dùng bằng đối tượng flash. Có cách nào tốt hơn để làm điều này?

Trả lời

6

Cách tiếp cận tốt nhất là kết thúc mô hình giả của bạn trong một lớp và thêm các xác thực vào đó. Cách Rails nói rằng bạn không nên đặt hành vi mô hình trên các bộ điều khiển, các xác nhận hợp lệ duy nhất phải là các hành động yêu cầu (xác thực, ủy quyền, v.v.)

Trong Rails 2.3+, bạn có thể bao gồm ActiveRecord::Validations , với một nhược điểm nhỏ là bạn phải định nghĩa một số phương thức mà lớp ActiveRecord mong đợi. Xem this post để có giải thích sâu hơn. Mã dưới đây chuyển thể từ bài rằng:

require 'active_record/validations' 

class Email 

    attr_accessor :name, :email 
    attr_accessor :errors 

    def initialize(*args) 
    # Create an Errors object, which is required by validations and to use some view methods. 
    @errors = ActiveRecord::Errors.new(self) 
    end 

    # Required method stubs 
    def save 
    end 

    def save! 
    end 

    def new_record? 
    false 
    end 

    def update_attribute 
    end 

    # Mix in that validation goodness! 
    include ActiveRecord::Validations 

    # Validations! =) 
    validates_presence_of :name 
    validates_format_of :email, :with => SOME_EMAIL_REGEXP 
end 

Trong Rails3, bạn có những sexy validations theo ý của bạn :)

+0

vị ngọt !!!!!!! – denniss

+0

Dễ như bánh. Cảm ơn bạn, nơi tìm kiếm một cái gì đó như thế này. –

+2

Đối với Rails 3, thay thế ActiveRecord :: Lỗi với ActiveModel :: Errors –

2

Đối với Rails 3+, bạn nên sử dụng ActiveModel::Validations thêm validations Rails kiểu cho một đối tượng của Ruby thường xuyên .

Từ the docs:

kích hoạt mẫu validations

Cung cấp một khuôn khổ xác nhận đầy đủ để đối tượng của bạn.

Một thực hiện tối thiểu có thể là:

class Person 
    include ActiveModel::Validations 

    attr_accessor :first_name, :last_name 

    validates_each :first_name, :last_name do |record, attr, value| 
    record.errors.add attr, 'starts with z.' if value.to_s[0] == ?z 
    end 
end 

nào cung cấp cho bạn với đầy đủ xác nhận chồng tiêu chuẩn mà bạn biết từ Active Record:

person = Person.new 
person.valid?     # => true 
person.invalid?     # => false 

person.first_name = 'zoolander' 
person.valid?     # => false 
person.invalid?     # => true 
person.errors.messages   # => {first_name:["starts with z."]} 

Lưu ý rằng ActiveModel::Validations tự động thêm một phương pháp sai sót cho các phiên bản của bạn được khởi tạo với đối tượng ActiveModel::Errors mới, do đó bạn không cần phải thực hiện việc này theo cách thủ công.

Các vấn đề liên quan