2012-04-12 34 views
11

Trong suốt đơn đăng ký của tôi self. không cần thiết để tham chiếu đến tên của người dùng. name hoạt động tốt.Tại sao lại sử dụng "tự" để truy cập các thuộc tính mô hình ActiveRecord/Rails?

Tại sao mã sau yêu cầu self hoạt động như dự định?

class User< ActiveRecord::Base 
    before_save :validate_name 

def validate_name 
    if self.name.nil? || self.name.empty? 
     self.name= "Mr. No Name" 
    end 
end 

Bằng cách này, tôi biết rằng validates_presence_of thể được sử dụng để ngăn chặn sự tiết kiệm, nhưng tôi muốn lưu với một mặc định nếu không có tên được đưa ra.

Rails 3.0.7.

Trả lời

23

Thường thì việc sử dụng self là bắt buộc Ruby nhận ra đó là một cuộc gọi phương thức và không hiểu sai nó là một biến. Nếu không có kiến ​​thức trước về một phương thức gọi là day=, thì day = "x" trông giống Ruby như một phép gán biến. self.day = "x" luôn là cuộc gọi phương thức.

Lý do điều này là do các phương pháp namename= được thêm động sau khi tệp lớp người dùng được phân tích cú pháp. Điều đầu tiên Rails thực hiện khi sử dụng một mô hình là tạo các phương thức cho các trường cơ sở dữ liệu liên quan, nhưng điều này xảy ra sau khi tệp user.rb của bạn được phân tích cú pháp.

+0

Xin lỗi, 'self.day' được cho là' self.name'! Tôi đã cập nhật câu hỏi. –

+6

Nit: Ruby sẽ không bao giờ dùng 'x = y' để gọi phương thức. Nó luôn luôn là một biến trực tiếp (hoặc hằng số, tùy thuộc vào trường hợp) gán. Biểu mẫu 'x' (như biểu thức) phụ thuộc vào nếu có một' x' trong phạm vi (như một biến) hay không. –

+0

Nếu 'name' và' name = 'được thêm động sau khi tệp lớp được phân tích cú pháp, thì có khi nào' name' có nghĩa là 'self.name' và các lần khác khi' name' là một biến cục bộ? –

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