2009-08-20 36 views
6

Vì vậy, về cơ bản tôi có một bộ điều khiển. một cái gì đó như thế nàyTruy cập các thuộc tính mô hình trong Rails

def show 
@user = User.find[:params[id]] 
#code to show in a view 
end 

Người dùng có các đặc tính như tên, địa chỉ, giới tính, v.v ... Làm cách nào để truy cập các thuộc tính này trong mô hình? Tôi có thể quá tải accesser mô hình cho tên ví dụ và thay thế nó bằng giá trị của riêng tôi hoặc nối một cái gì đó với nó. Giống như trong khung nhìn show.html.erb cho phương thức này, tôi có thể muốn nối tên người dùng với 'Mr.' hoặc 'Bà' tùy thuộc vào giới tính? Làm thế nào là nó có thể?

Trả lời

9

tôi sẽ ngần ngại để ghi đè các thuộc tính, và thay vào đó thêm vào các mô hình như thế này:

def titled_name 
    "#{title} #{name}" 
end 

Tuy nhiên, bạn có thể truy cập vào các lĩnh vực trực tiếp như thế này:

def name 
    "#{title} #{self[:name]}" 
end 
+0

Không phải khối mã thứ hai sẽ rơi vào cuộc gọi đệ quy và sự cố không? –

0

Bạn có thể dễ dàng quá tải các thuộc tính như bạn đề xuất.

ví dụ: nếu tên là một lĩnh vực trong bảng người dùng cơ sở dữ liệu, bạn có thể làm:

def name 
    "#{title} #{read_attribute[:name]}" 
end 

Chức năng read_attribute sẽ trả về giá trị cột dữ liệu cho lĩnh vực này.

Caveat: Tôi không chắc đây là một ý tưởng hay. Nếu bạn muốn một phương thức hiển thị dữ liệu mô hình theo cách được sửa đổi, tôi sẽ không bị quá tải các phương thức mặc định, và gọi chúng là cái gì đó khác - điều này sẽ tránh được một mức độ nhất định của sự làm xáo trộn.

Tài liệu ở đây: http://api.rubyonrails.org/classes/ActiveRecord/Base.html (dưới 'Ghi đè accessors mặc định')

+2

Might muốn cẩn thận làm điều đó vì nó có thể nhầm lẫn giao diện. Có thể là lẻ làm tên = "Joe" và nhận lại "Ông Joe". –

+1

Chưa kể, mã này chỉ hoạt động nếu cơ sở người dùng của bạn không chứa phụ nữ độc thân. ;) –

+0

@ Sarah, ah, bạn nói đúng, tôi sẽ sửa chữa nó. @Jamie - vâng tôi đồng ý, do đó báo trước đó là trong câu trả lời của tôi. – DanSingerman

0

Nếu bạn đang truy cập vào dữ liệu được lưu trữ trực tiếp trong cơ sở dữ liệu bạn có thể làm điều này trong bạn xem:

<%= @user.firstname %> 
<%= @user.gender %> 

, vv

Nếu bạn cần xây dựng các đại diện tùy chỉnh của dữ liệu, thì bạn sẽ cần tạo người trợ giúp hoặc mở rộng mô hình (như trên).

+0

Tôi cần những thứ này trong mô hình. Tôi biết làm thế nào để có được chúng trong tầm nhìn. –

0

tôi có xu hướng sử dụng các phương pháp helper thêm vào mô hình cho những thứ như thế:

def formatted_name 
    "#{title} #{first_name} #{last_name}" 
end 

(Chỉnh sửa bài trước Nhìn lại mã của tôi và người trợ giúp nhận ra được nghĩa vụ phải được trình bày liên quan đến (mark-. lên) thứ mà thôi.)

(chỉnh sửa một lần nữa để loại bỏ còn sót lại tham số ... Hừ, không đủ cà phê sáng nay.)

(chỉnh sửa một lần nữa để thay thế $ với # ... có lẽ tôi chỉ nên loại bỏ cái này hả?)

+0

Những đô la đó phải là băm. –

5

Bạn có thể tạo các thuộc tính ảo bên trong mô hình của bạn để đại diện cho các cấu trúc này.

Có một railscast về chủ đề này rất nhưng tóm lại bạn có thể làm một cái gì đó như thế này trong mô hình của bạn

def full_name 
    [first_name, last_name].join(' ') 
end 

def full_name=(name) 
    split = name.split(' ', 2) 
    self.first_name = split.first 
    self.last_name = split.last 
end 

Nếu bạn muốn thay đổi một cách rõ ràng giá trị của một thuộc tính khi đọc hoặc viết sau đó bạn có thể sử dụng phương thức read_attribute hoặc write_attribute. (Mặc dù tôi tin rằng những điều này có thể không được chấp nhận).

Những công việc này bằng cách thay thế phương thức truy cập của thuộc tính theo cách của riêng bạn. Ví dụ, một trường định danh nhánh có thể được nhập dưới dạng xxxxxx hoặc xx-xx-xx. Vì vậy, bạn có thể thay đổi phương thức branch_identifier = của bạn để loại bỏ dấu gạch ngang khi dữ liệu được lưu trữ trong cơ sở dữ liệu. Điều này có thể đạt được như vậy

def branch_identifier=(value) 
    write_attribute(:branch_identifier, value.gsub(/-/, '')) unless value.blank? 
end 
Các vấn đề liên quan