2010-07-24 22 views
10

Trong ứng dụng Ruby on Rails tôi đang cố gắng sử dụng thông tin từ các trường không được liên kết với mô hình trong quá trình xác thực.Đường ray: Sử dụng các trường biểu mẫu không được liên kết với mô hình trong xác nhận

Dưới đây là một phần của mô hình là một ví dụ (toàn bộ mô hình đã nhận được kinda lớn):

class Scorecard < ActiveRecord::Base 
    belongs_to :course 
    belongs_to :user 

    validate :attributes_consistency 

    def attributes_consistency 
    # Executed for all scorecards. Checks if the user completed the hole attributes correctly 
    if (params[:no_fairways] and any_fairways? and !only_nine?) or (params[:no_fairways] and !any_h1_to_h9_score_blank and any_h1_to_h9_fairway? and only_nine?) or (params[:no_fairways] and !any_h10_to_h18_score_blank and any_h10_to_h18_fairway? and only_nine?) 
     errors.add_to_base("You inidicated that you missed all the fairways, but you also marked one or more fairways in the scorecard. Either uncheck the fairways mistakenly marked or uncheck the 'No fairways' checkbox.") 
    end 
    if (params[:no_girs] and any_girs? and !only_nine?) or (params[:no_girs] and !any_h1_to_h9_score_blank and any_h1_to_h9_gir? and only_nine?) or (params[:no_girs] and !any_h10_to_h18_score_blank and any_h10_to_h18_gir? and only_nine?) 
     errors.add_to_base("You inidicated that you missed all the greens, but you also marked one or more greens in the scorecard. Either uncheck the marked greens on the scorecard or uncheck the 'No GIRs' checkbox.") 
    end 
    end # attributes_consistency 


    def any_h1_to_h9_score_blank? 
    h1_score.blank? or h2_score.blank? or h3_score.blank? or h4_score.blank? or h5_score.blank? or h6_score.blank? or h7_score.blank? or h8_score.blank? or h9_score.blank? 
    end 
    def any_h10_to_h18_score_blank? 
    h10_score.blank? or h11_score.blank? or h12_score.blank? or h13_score.blank? or h14_score.blank? or h15_score.blank? or h16_score.blank? or h17_score.blank? or h18_score.blank? 
    end 

    def any_h1_to_h9_fairway? 
    h1_fairway? or h2_fairway? or h3_fairway? or h4_fairway? or h5_fairway? or h6_fairway? or h7_fairway? or h8_fairway? or h9_fairway? 
    end 
    def any_h10_to_h18_fairway? 
    h10_fairway? or h11_fairway? or h12_fairway? or h13_fairway? or h14_fairway? or h15_fairway? or h16_fairway? or h17_fairway? or h18_fairway? 
    end 

    def any_h1_to_h9_gir? 
    h1_gir? or h2_gir? or h3_gir? or h4_gir? or h5_gir? or h6_gir? or h7_gir? or h8_gir? or h9_gir? 
    end 
    def any_h10_to_h18_gir? 
    h10_gir? or h11_gir? or h12_gir? or h13_gir? or h14_gir? or h15_gir? or h16_gir? or h17_gir? or h18_gir? 
    end 

Vì vậy, làm thế nào tôi có thể truy cập params từ mô hình?

Trả lời

15

Đừng để các thông số lẻn vào mô hình. Không có vấn đề gì về việc có một bộ điều khiển trong trường hợp đó. Thay vào đó, hãy kiểm xuất tập này từ Railscasts nói về các thuộc tính ảo không đi vào cơ sở dữ liệu nhưng vẫn có thể được sử dụng để xác thực.

Bạn không cần thuộc tính mô hình tương ứng cho thuộc tính ảo. Xác định các thuộc tính cục bộ cho lớp như @no_fairways giữ trạng thái.

class ScoreCard < ActiveRecord::Base 
    # define attributes and accessors for both fields 
    attr_accessor :no_fairways, :no_girs 

    .. 
end 

Bây giờ bên trong bạn tạo, bạn có thể chỉ cần viết:

<% form_for @scorecard %> 
    <%= f.check_box :no_fairways %> 
<% end %> 
+0

Đây sẽ là một giải pháp tuyệt vời nhưng bạn có thể đưa ra ví dụ về cách tôi có thể triển khai điều này không? Trong Railscast cụ thể, các "thuộc tính ảo" thực sự là các phương thức thao tác các thuộc tính thực. Tôi không có thuộc tính nào có thể liên kết với 'no_fairways' hoặc' no_girs'. – Jay

+0

@James - thuộc tính ảo không phải được liên kết với bất kỳ thuộc tính cơ sở dữ liệu nào. Bạn có thể định nghĩa các thuộc tính instance cũng sẽ hoạt động tốt. Đã cập nhật câu trả lời. – Anurag

+0

Lưu ý rằng attr liên kết với hộp kiểm sẽ không có giá trị trythy hoặc falsy. Theo mặc định, 'check_box' tạo đánh dấu dẫn đến chuỗi' "0" 'khi không được đánh dấu và' "1" 'khi được chọn. Ngay cả '" 0 ".present?' Là sự thật. – kolen

3

Tìm thấy các giải pháp, nhờ những biệt ngữ tuy nhiên, "thuộc tính ảo" giúp với google searchin.

Cách sạch nhất để thực hiện việc này là tạo các thuộc tính không phải là một phần của cơ sở dữ liệu nhưng vẫn là một phần của mô hình. Trong trường hợp của tôi, tôi đưa mẫu này vào mô hình:

attr_accessor :no_fairways 
attr_accessor :no_girs 

Thật dễ dàng! Hiện tại, @scorecard.no_fairways@scorecard.no_girs hoạt động giống như bất kỳ thuộc tính nào khác nhưng không phải là một phần của cơ sở dữ liệu.

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