2012-05-26 41 views
10

Tôi đang sử dụng simple_form và muốn ghi đè trình đọc cho thuộc tính mô hình.Ghi đè thuộc tính mô hình ghi đè không ảnh hưởng đến trường nhập simple_form

Như vậy sau không làm việc

class C < ActiveRecord::Base 

    # it has attribute named pack 

    def pack 
    "Some value" 
    end 

end 

Theo quan điểm có được đoạn mã sau

<%= simple_form_for @c do |f| %> 
    <%= f.input :pack %> 
<% end %> 

do đó nó sẽ hiển thị mẫu với hộp đầu vào có giá trị "Một số giá trị" nhưng nó là trống. Tại sao không ghi đè lên công việc với simple_form?

+0

tôi có cùng một vấn đề, tôi đoán là 'simple_form', hoặc đường ray nhiều khả năng hình thành những người giúp đỡ, sử dụng 'read_attribute' thay vì' S end' để lấy các giá trị đầu vào từ các đối tượng ActiveRecord. – Kris

Trả lời

12

Tôi nhận ra điều này, nhận xét của tôi về cơ bản là chính xác, simple_form dựa trên các trình trợ giúp biểu mẫu Rails sử dụng read_attribute để lấy giá trị từ đối tượng ActiveRecord do đó đọc giá trị trong cơ sở dữ liệu và không sử dụng phương pháp của bạn. Một triệu chứng của khớp nối bền vững/tên miền/trình bày. Các khoảng cách này là:

<%= f.input :pack, :input_html => { :value => @c.pack } %> 
# or 
<%= f.input :pack, :input_html => { :value => f.object.pack } %> 

Hoặc nếu bạn muốn trở thành hành vi mặc định này, bạn có thể tạo xây dựng hình thức riêng của bạn trên đầu trang của simple_for như:

# lib/my_form_builder.rb ** 

class MyFormBuilder < SimpleForm::FormBuilder                        
    def input(attribute_name, options={}, &block)         
    options[:input_html] ||= {}             
    options[:input_html][:value] = object.send(attribute_name)     
    super(attribute_name, options, &block)               
    end 
end 

Và trong hình của bạn:

<%= simple_form_for @c, :builder => MyFormBuilder do |f| %> 
    <%= f.input :pack %> 
<% end %> 

** trong Rails 3 Tôi không nghĩ rằng lib được thêm vào đường dẫn tải theo mặc định để bạn có thể cần phải thêm nó và khởi động lại ứng dụng hoặc đặt nó trong app/models (từ chối trách nhiệm không phải là một ý tưởng hay, lib là tốt hơn).

5

Trong Rails 3.2 ít nhất, nó không sử dụng trực tiếp read_attribute nữa. Nhưng nếu bạn đang sử dụng trường văn bản, nó sử dụng InstanceTag.value_before_type_cast để truy xuất lại giá trị. Này sử dụng:

object.respond_to?(method_name + "_before_type_cast") ? 
    object.send(method_name + "_before_type_cast") : 
    object.send(method_name) 

(nơi method_name là tên thuộc tính trong bối cảnh đó)

Vì vậy, nếu bạn muốn chắc chắn rằng hình thức sử dụng accessor thuộc tính của bạn, thêm bí danh sau:

alias pack_before_type_cast pack 

đó làm việc cho tôi, chỉ cần đảm bảo để trả về một chuỗi có ...

+0

Làm việc cho tôi. :) –

+0

Làm việc cho tôi. Đã phải sử dụng 'alias_method' cuz i là một mối quan tâm –

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