2013-07-24 15 views
7

Câu hỏi của tôi tương tự như Build vs new in Rails 3.Xây dựng và mới trong Rails 4

Trong Rails 3, tôi có thể tạo đối tượng trong chế độ xem để kiểm tra ủy quyền qua cancan.

<% if can? :create, @question.answers.new %> 
    # Code... 
<% end %> 

Trong Rails 3, sự khác biệt giữa .new.build.build thêm các đối tượng mới được xây dựng vào bộ sưu tập của cha mẹ, mà sau đó dẫn đến một kỷ lục bổ sung trong quan điểm, mà rõ ràng đã không được như mong muốn.

Trong Rails 4, cả hai đều thêm đối tượng vào bộ sưu tập, hiển thị bản ghi trống trong chế độ xem.

Có ai có lời khuyên nào về cách giải quyết vấn đề này không? Kiểm tra nếu một hồ sơ là .persisted? trong xem sẽ là một lựa chọn nhưng bằng cách nào đó tôi cảm thấy tôi không cần phải làm điều đó.

Edit: Để làm rõ, mô hình Cancan trông như thế này:

can :manage, Answer do |answer| 
    user.belongables.include?(answer.question.try(:belongable)) 
end 

Bởi vì điều này, tôi không thể chỉ kiểm tra bằng cách lớp. Một thực tế thực tế là cần thiết để so sánh dựa trên mối quan hệ.

+1

Làm thế nào về 'nếu có thể? : tạo, Trả lời' như một đối tượng ném đi? (Có vẻ như bạn có thể vượt qua lớp học từ đây: https://github.com/ryanb/cancan/wiki/Checking-Abilities#checking-with-class) – GSP

Trả lời

2

Tôi có thể giải quyết vấn đề và phát hiện ra hai cách.

Đầu tiên, khi https://github.com/rails/rails/issues/9167 chỉ ra, sử dụng scoped giải quyết vấn đề này. Vì vậy, thay vào đó tôi đang sử dụng @question.answers.scoped.new. Như tôi đã giải thích, một đơn giản Answer.new(question: @question) đã không thành công vì có nhiều dữ liệu cần thiết hơn, và ví dụ đã được đơn giản hóa.

Thứ hai, giữ mẫu MVC. Bộ điều khiển chịu trách nhiệm chuẩn bị dữ liệu. Vì vậy, khi lặp qua các câu hỏi, bạn chuẩn bị dữ liệu trong bộ điều khiển của mình, như @answers = @question.answers. Bây giờ, bộ sưu tập @answers không bị ảnh hưởng bởi .new hoặc .build về liên kết.

4

Tôi không cập nhật đầy đủ trên CanCan nhưng trừ khi khả năng tạo được gắn với một cá thể @question cụ thể trong CanCan có vẻ như bạn có thể kiểm tra ủy quyền trực tiếp với lớp học. Không có cá thể nào cần phải được xây dựng và không có đối tượng không liên quan trong chế độ xem của bạn.

<% if can? :create, Answer %> 
    # Code.. 
<% end %> 

https://github.com/ryanb/cancan/wiki/Checking-Abilities#checking-with-class

EDIT:

Dựa trên chỉnh sửa, hãy thử xây dựng một trả lời độc lập với các hiệp hội cho câu hỏi mà bạn cần.

<% if can? :create, Answer.new(question: @question) %> 
    # Code.. 
<% end %> 

điều này không nên, ít nhất, thêm một ví dụ Answer vào bộ sưu tập @question.answers của bạn.

+0

Vấn đề là các hạn chế có thể áp dụng cho tập con của các câu trả lời được gắn cho câu hỏi cụ thể đó, IMHO yêu cầu một cá thể để kiểm tra. – pduersteler

+0

Có lẽ bao gồm cả định nghĩa khả năng CanCan của bạn có thể cung cấp thông tin chi tiết hơn? – GSP

+0

Câu hỏi được cập nhật. – pduersteler