8

Im bị kẹt nghiêm trọng về vấn đề mà tôi có mô hình Người dùng và Hồ sơ. bất kỳ điều gì tôi thử có vẻ như xác thực không được kích hoạt cho bất kỳ thuộc tính Tiểu sử nàobị kẹt nghiêm trọng: các xác thực không được kích hoạt cho tài nguyên lồng nhau với fields_for

  • Mô hình hồ sơ thuộc về Người dùng. Tài has_one Hồ sơ
  • On mẫu đăng ký sử dụng fields_for có một số lĩnh vực thông tin hiển thị (giới tính, và thành phố và quốc gia)
  • Dù tôi đã cố gắng, tôi không thể để cho việc xác nhận cho giới và thành phố (hồ sơ cá nhân fields_for lĩnh vực)

hình thức của tôi:

- title t(:title, :scope => :register) 
%h1= yield(:title) 

    = simple_form_for(resource, :as => resource_name, :html => { :class => 'form-horizontal' } , :validate => true , :url => registration_path(resource_name)) do |f| 

    = f.input :username,     :label => t(:username) 
    = f.input :email,      :label => t(:email), 
              :hint => t(:hint_email_visible) 
    = f.input :password,     :label => t(:password), :require => true 
    = f.input :password_confirmation,  :label => t(:password_confirm) 


    - resource.build_profile 
    = f.fields_for :profile do |f| 

     #div 

     = f.hidden_field :form, :value => "signup" 

     .clear 

     = f.input :gender,    :collection => [['Male', 'male'], ['Female', 'female']], 
              :as => :radio 

    = f.input :city, 
       :readonly => "readonly", 
       :label => t(:city) 

    .ruler 

    = f.input :country, 
       :label => "Your country", 
       :collection => [DataCountry.where(:code => 155).first], 
       :value => @city, 
       :id => "country", 
       :name => "country" 

    .clear 


    = f.button :submit, t(:submit, :scope => :register) + " »" 

mô hình tài khoản của tôi có này:

accepts_nested_attributes_for :profile 

Thông tin cá nhân mô hình với kiểm chứng thực là như:

validates_presence_of :gender 
    validates_presence_of :city 
    validates_presence_of :country 

params của tôi:

-- !ruby/hash:ActiveSupport::HashWithIndifferentAccess 
utf8: ✓ 
authenticity_token: <mytokenhere> 
user: !ruby/hash:ActiveSupport::HashWithIndifferentAccess 
    invite_code: '' 
    username: username 
    email: '' 
    password: '' 
    password_confirmation: '' 
    profile_attributes: !ruby/hash:ActiveSupport::HashWithIndifferentAccess 
    form: signup 
    gender: male 
    dob(3i): '9' 
    dob(2i): '7' 
    dob(1i): '1942' 
    city: 'somevalue' 
    country: 'somevalue' 
commit: Register » 
action: create 
controller: registrations 

Rails console không:

User.new 


=> #<User id: nil, email: "", encrypted_password: "", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, password_salt: nil, confirmation_token: nil, confirmed_at: nil, confirmation_sent_at: nil, unconfirmed_email: nil, failed_attempts: 0, unlock_token: nil, locked_at: nil, authentication_token: nil, username: nil, is_blocked: nil, is_deleted: nil, role: nil, slug: nil, created_at: nil, updated_at: nil, last_seen: nil, credits: nil, invite_code: nil, is_moderated: nil, locale: nil, status: nil, login_token: nil> 

Profile.new

=> #<Profile id: nil, user_id: nil, gender: nil, country: nil, state: nil, city: nil, status: nil, counter_cache: nil> 

- CẬP NHẬT 19 Tháng 7 '12

tôi thêm

- @user.errors.full_messages.each do |message| 
    = message 
    .clear 

Để hình thức để xem chính xác những gì đang xảy ra và điều này ném sau danh sách lỗi:

Email can't be blank 
Email can't be blank 
Password can't be blank 
Password can't be blank 
Profile city can't be blank 
Profile gender can't be blank 
Profile is invalid 
Username can't be blank 
Password confirmation can't be blank 

Vì vậy, có vẻ như xác thực được kiểm tra .... Nhưng không có kiểu dáng lỗi được áp dụng! Ngoài ra hồ sơ không hợp lệ ???? Tôi không chắc chắn nhưng có nghĩa là hãy tham khảo

+0

Hãy thử thay đổi thành 'validates_inclusion_of: giới tính, bằng:% w (nam nữ)' và xem liệu nó có cung cấp cho bạn thông báo lỗi –

+0

Thx đã cố gắng vô ích không. Tôi thử nó với một số lĩnh vực hồ sơ khác tôi sẽ thêm vào các hình thức có lẽ là một vấn đề liên quan đến giới tính của mình – Rubytastic

+1

Bạn đã thử đặt 'validates_associated: profile' trong mô hình' Người dùng' của bạn chưa? – HargrimmTheBleak

Trả lời

0

Nhiều giờ chi tiêu cố gắng để sửa lỗi này bây giờ là giải pháp được rất đơn giản dựa trên đề xuất trong chủ đề này, tôi phát hiện ra rằng thay vì

SAI:

- resource.build_profile 

ĐÚNG:

- resource.build_profile unless resource.profile 

những gì điều này không làm sạch hồ sơ nhưng sử dụng một cái cũ nếu nó có sẵn ... do đó, không làm sạch tất cả các lỗi! Mong rằng điều này sẽ giúp ai đó trong tương lai!

2

Kiểm tra xem bạn có bất kỳ giá trị mặc định nào trong bộ cơ sở dữ liệu hay không. Có vẻ như trong thông số biểu mẫu, bạn đã dán trong câu hỏi, giới tính có giá trị male được chuyển. Thông số hình thức này có được thông qua ngay cả khi bạn không kiểm tra bất kỳ điều gì về giới tính không? Trong trường hợp đó, đây phải là trường hợp mà trường giới tính trong cơ sở dữ liệu phải có giá trị mặc định cho giới tính là male. Trong trường hợp đó, ngay cả đối tượng mô hình mới Profile sẽ có thuộc tính giới tính là male và vì vậy nó sẽ vượt qua các xác thực và lưu giới tính là male trong cơ sở dữ liệu. Ví dụ: tôi có trường boolean is_admin trong bảng người dùng và đặt giá trị mặc định là false hoặc 0.Sau đó, nếu tôi làm điều này:

User.new 
=> #<User id: nil, name: nil, email: nil, is_admin: false> 

Bạn có thể xem thuộc tính is_admin được thiết lập để false thay vì nil. Bây giờ nếu chúng ta không vượt qua bất kỳ giá trị nào cho is_admin, tại đây nó sẽ được lưu dưới dạng false trong cơ sở dữ liệu và cũng sẽ không kích hoạt xác thực cho trường is_admin, vì nó có mặt trong thuộc tính của đối tượng (với giá trị false).

+0

Tôi đã kiểm tra điều này, nhưng đây không phải là trường hợp, giới tính không được đặt – Rubytastic

+0

Cập nhật với đầu ra chính xác – Rubytastic

+0

@Rubytastic: Bạn đã cho đối tượng 'User.new'.' Giới tính' nằm trong bảng hồ sơ, phải không? Bạn có thể kiểm tra kết quả của 'Profile.new'? – rubyprince

3

Trước hết, các thông số bạn đã dán bao gồm các giá trị cho thành phố, quốc gia và giới tính của hồ sơ. Nếu điều này là chính xác, khi đó việc xác thực phải được thông qua, bởi vì mô hình Profile xác thực sự hiện diện của 3 trường này - và chúng hiện diện.

Tôi cũng lưu ý rằng bạn đang thực hiện resource.build_profile trong chế độ xem, sẽ tạo cấu hình mặc định thuộc về người dùng. Nếu bất kỳ giá trị nào đang được gán trong cấu hình trong quá trình khởi tạo, điều này sẽ khiến chúng biến đổi thành biểu mẫu và cuối cùng là vào hàm băm params.

Vì vậy, tôi đoán là bạn đang điền vào các trường ở đâu đó dọc theo dòng, có lẽ trong các mô hình User hoặc Profile. Bạn nên kiểm tra lại, đặc biệt trong quá trình khởi tạo hồ sơ mới.

Đó là tất cả những gì tôi có thể đoán được từ dữ liệu bạn đã cung cấp. Nếu bạn vẫn không thể tìm thấy sự cố, bạn có thể thử cam kết (hoặc một ứng dụng riêng biệt tái tạo sự cố, nếu bạn không thoải mái khi chia sẻ ứng dụng thực) với GitHub để chúng tôi có thể phân tích vấn đề trực tiếp hơn.

EDIT: chỉ cần nhận thấy, trong tiền thưởng của bạn, bạn đã viết:

bất cứ ai có thể cung cấp một ví dụ làm việc [của] nguồn lực lồng và kiểm chứng thực

Vì vậy, xem https://github.com/sinisterchipmunk/rubytastic cho một ví dụ đơn giản về thành viên xác thực với các thuộc tính lồng nhau cho một Cấu hình, được mô hình hóa sau câu hỏi của bạn. Nó xác nhận User#email, Profile#city, Profile#countryProfile#gender.

+0

Nếu tôi để trống 3 trường, biểu mẫu vẫn còn nắp, không có lỗi (tôi đặt 3 trường hồ sơ cần thiết). Thx rất nhiều cho bình luận và dành thời gian để viết một ví dụ. Tôi kiểm tra chúng ra vào ngày mai đầy đủ chi tiết và báo cáo lại sau đó. thx một lần nữa. – Rubytastic

+0

Tôi đã sử dụng vòng lặp tất cả các mã lỗi từ ví dụ của bạn, không nghĩ một giây về việc thử rằng có vẻ như tạo kiểu lỗi không được áp dụng. Vì vậy, các lĩnh vực không hợp lệ nhưng không có CSS ​​cũng các hình thức không được repopulated. Tôi sẽ xóa mẫu hồ sơ của tôi ngay bây giờ để xem liệu có mã nào gây ra các sự cố này hay không. – Rubytastic

+0

Có, Rails 2 có phương thức '<% = f.error_messages%>' nhưng nó đã bị loại bỏ trong Rails 3 vì nhóm lõi cảm thấy nó quá "ma thuật", trong đó không ai thực sự hiểu nó đã làm gì. Vì vậy, bây giờ bạn phải làm phong cách cho mình, nhưng nó không làm việc nhiều hơn anyway. Các biểu mẫu có thể không được repopulated vì 'resource.build_profile' của bạn, có thể ghi đè lên hồ sơ trước đó (không hợp lệ) với một hồ sơ hoàn toàn mới (trống). – sinisterchipmunk

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