2010-02-09 19 views
9

Tôi đang cố truy cập mô hình cha mẹ của mình trong mô hình con khi xác thực. Tôi tìm thấy một cái gì đó về một tài sản nghịch đảo trên has_one, nhưng Rails của tôi 2.3.5 không nhận ra nó, vì vậy nó phải có bao giờ làm cho nó vào bản phát hành. Tôi không chắc chắn nếu đó là chính xác những gì tôi cần mặc dù.Rails accept_nested_attributes_for child không có bộ cha mẹ khi xác nhận

Tôi muốn xác thực trẻ có điều kiện dựa trên thuộc tính gốc. Mô hình Phụ huynh của tôi đã được tạo. Nếu đứa trẻ không được tạo ra khi tôi update_attributes trên cha mẹ, sau đó nó không có quyền truy cập vào phụ huynh. Tôi tự hỏi làm thế nào tôi có thể truy cập vào phụ huynh này. Nó nên được dễ dàng, một cái gì đó như parent.build_child đặt parent_id của mô hình con, tại sao nó không làm điều đó khi xây dựng các con cho accepts_nested_attributes_for?

Ví dụ:

class Parent < AR 
    has_one :child 
    accepts_nested_attributes_for :child 
end 
class Child < AR 
    belongs_to :parent 
    validates_presence_of :name, :if => :some_method 

    def some_method 
    return self.parent.some_condition # => undefined method `some_condition' for nil:NilClass 
    end 
end 

hình thức của tôi là tiêu chuẩn:

<% form_for @parent do |f| %> 
    <% f.fields_for :child do |c| %> 
    <%= c.name %> 
    <% end %> 
<% end %> 

Với một phương pháp cập nhật

def update 
    @parent = Parent.find(params[:id]) 
    @parent.update_attributes(params[:parent]) # => this is where my child validations take place 
end 

Trả lời

0

kiểm tra các trang web này, có lẽ họ sẽ giúp bạn ...

Rails Nested Attributes Association Validation Failing

accepts_nested_attributes_for child association validation failing

http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes

có vẻ như, đường ray sẽ gán PARENT_ID sau khi xác nhận đứa trẻ thành công. (như cha mẹ có một id sau khi nó được lưu)

có lẽ đáng để thử này:

child.parent.some_condition 

thay vì self.parent.some_condition ... ai biết được ...

7

Bạn không thể làm điều này bởi vì trong bộ nhớ con không biết cha mẹ của nó được gán cho. Nó chỉ biết sau khi lưu. Ví dụ.

child = parent.build_child 
parent.child # => child 
child.parent # => nil 

# BUT 
child.parent = parent 
child.parent # => parent 
parent.child # => child 

Vì vậy, bạn có thể ép buộc hành vi này bằng cách thực hiện liên kết ngược theo cách thủ công. Ví dụ:

def child_with_inverse_assignment=(child) 
    child.parent = self 
    self.child_without_inverse_assignment = child 
end 

def build_child_with_inverse_assignment(*args) 
    build_child_without_inverse_assignment(*args) 
    child.parent = self 
    child 
end 

def create_child_with_inverse_assignment(*args) 
    create_child_without_inverse_assignment(*args) 
    child.parent = self 
    child 
end 

alias_method_chain :"child=", :inverse_assignment 
alias_method_chain :build_child, :inverse_assignment 
alias_method_chain :create_child, :inverse_assignment 

Nếu bạn thực sự thấy cần thiết.

P.S. Lý do nó không làm nó bây giờ là bởi vì nó không phải là quá dễ dàng. Nó cần phải được cho biết một cách rõ ràng về cách truy cập cha/con trong mỗi trường hợp cụ thể. Một cách tiếp cận toàn diện với bản đồ nhận dạng sẽ giải quyết được nó, nhưng đối với phiên bản mới hơn có :inverse_of giải pháp thay thế. Một số cuộc thảo luận như this one đã diễn ra trên các nhóm tin tức.

8

Tôi gặp sự cố tương tự: Ruby on Rails - nested attributes: How do I access the parent model from child model

Đây là cách tôi giải quyết nó sau cùng; bằng cách đặt cha mẹ trên gọi lại

class Parent < AR 
    has_one :child, :before_add => :set_nest 
    accepts_nested_attributes_for :child 

private 
    def set_nest(child) 
    child.parent ||= self 
    end 
end 
+0

Tôi đã gặp lỗi tương tự như op, nhưng khi tôi thử phương pháp này, tôi đã nhận được "Khóa không xác định: trước_add"? – Kvass

8

Về cơ bản tôi cũng gặp vấn đề tương tự với Rails 3.2.Như được đề xuất trong câu hỏi, thêm tùy chọn inverse_of vào liên kết của phụ huynh đã sửa nó cho tôi.

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