2013-07-31 63 views
11

Có một trang liên hệ cung cấp tên, điện thoại, email và tin nhắn, sau đó gửi đến email của quản trị viên. Không có lý do gì để lưu trữ tin nhắn trong DB.Xác thực Rails từ bộ điều khiển

Câu hỏi. Làm thế nào để:

  1. Sử dụng Rails kiểm chứng thực trong điều khiển, không sử dụng mô hình ở tất cả, HOẶC

  2. Sử dụng kiểm chứng thực trong mô hình, nhưng không có bất kỳ mối quan hệ DB

UPD:

Mô hình:

class ContactPageMessage 
include ActiveModel::Validations 
include ActiveModel::Conversion 
extend ActiveModel::Naming 

attr_accessor :name, :telephone, :email, :message 
validates :name, :telephone, :email, :message, presence: true 
validates :email, email_format: { :message => "Неверный формат E-mail адреса"} 

def initialize(attributes = {}) 
    attributes.each do |name, value| 
     send("#{name}=", value) 
    end 
end 

def persisted? 
    false 
end 
end 

điều khiển:

def sendmessage 
cpm = ContactPageMessage.new() 
if cpm.valid? 
    @settings = Setting.first 
    if [email protected] 
     redirect_to contacts_path, :alert => "Fail" 
    end 
    if ContactPageMessage.received(params).deliver 
     redirect_to contacts_path, :notice => "Success" 
    else 
     redirect_to contacts_path, :alert => "Fail" 
    end 
else 
    redirect_to contacts_path, :alert => "Fail" 
end 
end 
end 
+0

Tôi nghĩ bạn đã có một lớp học có cùng tên 'ContactPageMessage'. đó là vấn đề. –

+0

Bạn có muốn lưu tên, điện thoại và email trong cơ sở dữ liệu và chỉ tin nhắn mới cần được xác thực và không được lưu trong cơ sở dữ liệu không? – user2801

+0

@sumi, tôi không muốn lưu bất kỳ thứ gì vào DB. Vừa được xác thực. – Roman

Trả lời

8

bạn nên sử dụng mô hình mà không kế thừa từ lớp ActiveRecord::Base.

class ContactPageMessage 

    include ActiveModel::Validations 
    include ActiveModel::Conversion 
    extend ActiveModel::Naming 

    attr_accessor :whatever 

    validates :whatever, :presence => true 

    def initialize(attributes = {}) 
    attributes.each do |name, value| 
     send("#{name}=", value) 
    end 
    end 

    def persisted? 
    false 
    end 

end 

Thông qua điều này, bạn có thể khởi tạo đối tượng mới và có thể gọi xác thực trên đối tượng đó.

Tôi nghĩ rằng bạn có một tên lớp khác nhau với cùng một tên, trong mã điều khiển của bạn, tôi có thể thấy điều này:

if ContactPageMessage.received(params).deliver 
    redirect_to contacts_path, :notice => "Success" 
else 

nếu đây là lớp bưu phẩm của bạn thay đổi tên thành ContactPageMessageMailer. bạn sẽ không có người đăng nhập nào nhận được lỗi đó.

Hy vọng điều đó sẽ hữu ích. Cảm ơn

+0

Tôi đã có điều này: 'phương thức riêng '' mới' được gọi cho ContactPageMessage: Class' (Sử dụng Rails 4, có thể lỗi trong này?) – Roman

+0

Dán dấu vết ứng dụng của bạn ở đây. –

+0

và cách bạn đang gọi phương thức mới? viết ở đây. –

5

tôi vẫn khuyên bạn sử dụng mô hình, mô hình đường ray không phải kế thừa từ ActiveRecord::Base. Ví dụ:

class Contact 
    include ActiveModel::Validations 
    attr_accessor :name, :telephone, :email, :message 
    validates_presence_of :name, :telephone, :email, :message 
    validates_format_of :email, with: EMAIL_REGEXP 
end 

và bạn có thể sử dụng nó trong điều khiển của bạn với:

contact = Contact.new 
# ... 
if contact.valid? 
    # do something 
else 
    # do something else 
end 
-3

Trong mô hình của bạn, bạn có thể thêm các getter dưới đây sẽ chỉ thiết lập và phương pháp setter cho tin nhắn và bạn có thể có xác thực trên thư mà không có cột trong db

attr_accessor :message 
validates :message, presence: true 
+0

'class Contact' ' validates: message,: presence => true' 'end' ' # => NoMethodError: phương thức chưa xác định 'validates 'cho Contact: Class' –

+0

Nếu bạn đã có một mô hình và chỉ một vài các thuộc tính bạn không cần lưu trữ nó trong db thì bạn có thể đi với tùy chọn này. Tùy chọn ở trên bạn chỉ có thể bao gồm trên Mô hình được kế thừa từ ActiveRecord :: Base.Nếu bạn muốn một Class độc lập có thể hoạt động như Model bằng cách sử dụng Rails4, nó rất dễ dàng, bạn chỉ cần bao gồm ActiveModel :: Model trong lớp của bạn và làm như trên. Ref [link] (http://edgeapi.rubyonrails.org/classes/ActiveModel/Model.html) – user2801

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