2011-04-15 37 views
5

Tôi đang thêm omniauth vào ứng dụng có đường ray 2.3.11. Tôi về cơ bản theo sau railscast của Ryan Bate (với những sửa đổi thích hợp cho đường ray 2.3). Nhưng tôi thấy điều gì đó rất lạ khi thử nghiệm phần này của mã:find_or_create_by nhiều thuộc tính không tìm thấy bản ghi khi được gọi trong ngữ cảnh của đối tượng thuộc đối tượng (AR lỗi trong 2.3.11?)

class AuthenticationsController < ApplicationController 
    ... 

    def create 
    auth = request.env["omniauth.auth"] 
    current_user.authentications.find_or_create_by_provider_and_uid(auth['provider'], auth['uid']) 
    flash[:notice] = "Authentication successful." 
    redirect_to authentications_url 
    end 

    ... 
end 

Find_or_create luôn tạo. Trong nhật ký, tôi thấy điều này chọn:

SELECT * FROM `authentications` WHERE (`authentications`.`provider` IN ('facebook','XXXXXXX') AND `authentications`.`uid` IS NULL) AND ((`authentications`.`user_id` = 10)) LIMIT 1 

Đó không phải là lựa chọn đúng cho phương pháp đó. auth ['provider'] và auth ['uid'] được điền chính xác (và nó tạo bản ghi mới tốt).

Phức tạp hơn: Nếu tôi vào bảng điều khiển và làm Authentication.find_or_create_by_provider_and_uid('facebook', 'XXXXX'), nó hoạt động tốt (tìm thấy bản ghi hiện có). Nhưng nếu tôi có được một người dùng và làm user.authentications.find_or_create_by_provider_and_uid('facebook', 'XXXXX'), nó tạo một bản ghi mới và tôi thấy cùng một câu lệnh truy vấn có vấn đề trong nhật ký.

Tôi biết tôi có thể làm việc xung quanh điều này (và Ryan Bates thay đổi mã này sau này), nhưng điều này là rất khó khăn. Tôi có thiếu một cái gì đó hoặc hiện này trông giống như một lỗi trong ActiveRecord?

Điều này không dành riêng cho OmniAuth hoặc Devise. Trước khi gửi bài này, tôi đã thử nó với hai lớp khác (các lớp khá đơn giản). Cùng một kết quả [Klass.find_or_create_by_a_and_b ('A', 'B') hoạt động nhưng parent.klasses.find_or_create_by_a_and_b ('A', 'B') tạo ra một lựa chọn muốn b là null và một ('A', 'B ')].

Bây giờ tôi chắc chắn nghĩ đây là lỗi 2.3.11. Trước khi tôi gửi một lỗi, có ai nhìn thấy bất cứ điều gì tôi đang thiếu? Có ai nhìn thấy vấn đề này không?

+1

Âm thanh như một lỗi. Gửi nó cho dự án đường ray. –

Trả lời

0

Giá trị của auth ['provider'] và auth ['uid'] là gì? Có lẽ tôi sai, nhưng có vẻ như tôi là auth ['provider'] là ['facebook', 'XXXXXXX'] và auth ['uid'] là không.

1

Tôi vừa cập nhật ứng dụng từ Rails 2.3.10 đến 2.3.11 và tôi cũng gặp phải lỗi này.

Trong mã của chúng ta, chúng ta có:

 rate_plan = lodging.rate_plans.find_or_create_by_primary_code_and_secondary_code(rate_plan_code, inv_type_code) 

mà làm việc tốt dưới 2.3.10. Theo 2.3.11, urbanplan sẽ trở thành một kỷ lục mới, mặc dù find_by_primary_code_and_secondary_code (premiumplan_code, inv_type_code) sẽ tìm thấy một bản ghi hiện có. Không chỉ là lập kế hoạch cho một bản ghi mới trong 2.3.11, nhưng nó không được lưu vì xác thực tính duy nhất của chúng tôi không được đáp ứng.

Ugh. Tôi sẽ quay lại 2.3.10 ngay bây giờ.

0

Nó chắc chắn phải, như Tudor Constantin nói, một vấn đề với giá trị auth ['nhà cung cấp'], vì nó có vẻ là một mảng. Bạn đã cố thực hiện cuộc gọi đặt qua biến này chưa? Kết quả là gì?

Ngoài ra tôi hy vọng rằng bạn biết rằng đây:

Authentication.find_or_create_by_provider_and_uid ('facebook', 'XXXXX')

không giống như thế này:

user.authentications.find_or_create_by_provider_and_uid ('facebook', 'XXXXX')

Trong trường hợp đầu tiên mà bạn đang tìm kiếm thông qua tất cả các Xác thực trường/hàng, trong khi trong một giây bạn đang thu hẹp phạm vi tìm kiếm để nó chỉ tìm kiếm các cá thể/hàng xác thực thuộc về cá thể cụ thể của Người dùng.

+0

Không. Đọc lại bài đăng (và nhận xét của người dùng gặp vấn đề tương tự). auth ['provider'] không phải là một mảng (tôi đã xác minh giá trị của nó, tất nhiên - và nó là một mảng, nó sẽ không hoạt động trong tìm kiếm không có phạm vi, nhưng nó có). Hơn nữa, hãy xem mã tôi đã nhập vào bảng điều khiển và mã giả từ ví dụ đơn giản mà tôi đã thử. Những người đang chỉ định chuỗi ký tự. Chắc chắn không có mảng ở đó! (Và tất nhiên tôi biết sự khác biệt giữa hai phát hiện, điều đó phải rõ ràng từ bài đăng.) Tại thời điểm này, tôi chắc chắn đây là lỗi trong 2.3.11 AR. –

0

Kiểm tra

auth['uid']

Tôi đoán nó đang đến trống cho bạn. Đó là lý do tại sao

`authentications`.`uid` IS NULL) AND ((`authentications`.`user_id` = 10))

được mâu thuẫn

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