8

Làm cách nào tôi có thể sử dụng thuộc tính ảo (getter, setter) trong đường ray 4, vì 'attr_accessible' đã bị xóa.Thuộc tính ảo trong đường ray 4

Tôi nhận được vấn đề, đây

def tags_list 
    @tags = self.tags.collect(&:name).join(', ') 
    end 

tôi có thể đạt được trên phương pháp, nhưng không thể tiếp cận với setter dưới đây, khi cố gắng cập nhật/tạo.

def tags_list=(tags) 
    @tags = tags 
    end 
+1

Bạn nhận được attr_accessible và attr_accessor hỗn hợp? attr_accessible đã biến mất - được thay thế bằng các tham số mạnh mẽ. Nhưng theo như tôi biết, attr_accessor vẫn còn. – Edward

+0

Xin lỗi, Thẻ của nó: tags_list –

+2

nếu bạn sử dụng attr_accessor, bạn không cần phải xác định một trình gỡ bỏ hoặc thiết lập nào cả. attr_accessor là một macro tạo cả hai macro cho bạn. –

Trả lời

12

Sử dụng thuộc tính ảo trong Rails 4 khá giống với attr_accessible. Bạn chỉ cần thêm thuộc tính ảo của bạn vào các tham số được phép trong bộ điều khiển của bạn (thay vì attr_accessible), sau đó thêm các phương thức getter và setter như bình thường trong mô hình của bạn.

# your_controller.rb 
private 

def your_model_params 
    params.require(:your_model_name).permit(:tags_list) 
end 
+2

Nhưng nó không hoạt động với #new và #create vào lúc này, điều này làm cho nó trở nên vô dụng, bởi vì bạn sẽ phải viết 'your_virtual_attr =: something' một cách riêng biệt mọi lúc. Bất cứ ai khác nhận thấy điều này và có một đầu mối về cách xử lý nó? – phikes

+1

Tôi cũng nhận thấy rằng gọi 'Tag.new (tags_list: [1, 2])' không kích hoạt 'tags_list =()' thuộc tính ảo .. đây có phải là lỗi không? – Feech

+1

@phó, chỉ là 'before_action: your_model_params'? Bạn có thể tùy chọn specfiy:, chỉ: [: new,: create] hoặc 'exlcude:, ngoại trừ: [: action1,: action2, etc.]'. –

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