2011-02-07 18 views
29

Khi bạn đã có một trường mẫu như thế này:Làm cách nào để lấy thuộc tính HTML 'tên' mà trình tạo biểu mẫu đường ray sẽ tạo cho một trường nhất định?

<%= f.text_field :last_name %> 

nó sẽ tạo ra này trong HTML:

<input id="person_last_name" name="person[last_name]" size="30" type="text" /> 

Tôi muốn biết nếu có bất kỳ cách nào để có được những thuộc tính tên (trong trường hợp này là "người [last_name]") sẽ được tạo.

Dường như có một điều kỳ lạ để có được nhưng tôi có lý do! Tôi cũng không thể bực mình khi đưa ra một lời giải thích dài dòng.

+2

Dường như có gì đó trong dòng "đối tượng [thuộc tính]", phải không? – LapinLove404

Trả lời

9

Vâng, như mong đợi, nhận xét bạn có đúng như vậy đấy :)

Nơi trong nguồn nơi này xảy ra là lớp InstanceTag mà tất cả các cuộc tập trận tạo thẻ xuống. Phương pháp này được gọi là tag_name.

+0

Không thực sự biết nơi cần tìm thông tin - cảm ơn – LapinLove404

+1

Xin cảm ơn! Tôi vừa mới đi sâu vào nguồn. Tôi biết rằng nó có khá nhiều "đối tượng [thuộc tính]" nhưng mọi thứ phức tạp hơn nhiều khi bạn có các mẫu biểu mẫu lồng nhau - một trong những lý do tôi đang tìm kiếm một phương thức như vậy. – digitalWestie

1

Câu trả lời của Neutrino thật tuyệt vời. Chỉ muốn thêm những gì tôi tìm thấy, có thể không chính xác. Nhưng nó làm việc cho tôi.

tìm thấy bên dưới phương pháp trong action_view/giúp đỡ/form_tag_helper.rb

def sanitized_object_name 
     @sanitized_object_name ||= @object_name.gsub(/\]\[|[^-a-zA-Z0-9:.]/, "_").sub(/_$/, "") 
    end 

Hy vọng nó giúp.

32

Sau khi kiểm tra đối tượng biểu mẫu, tôi thấy rằng bạn có thể nhận được object_name từ nó.

Vì vậy, đây làm việc tốt cho tôi: "#{f.object_name}[field_name]"

Mà sẽ generate: object[object_attributes][0][field_name]

+0

Thậm chí tốt hơn, với Rails 4.0+, bằng cách sử dụng tùy chọn: as, bạn có thể chỉ định object_name khi bạn tạo biểu mẫu (miễn là bạn không khởi tạo bằng chuỗi hoặc ký hiệu). Ví dụ: <% = form_for (@object, as: 'my_obj_name', ...) sẽ tạo tất cả các trường là my_obj_name [field_name]. – Keith

3
ActionView::Helpers::InstanceTag.new(
    ActiveModel::Naming.param_key(@object_in_form_for), 
    :your_attribute, 
    :this_param_is_ignored 
).send(:tag_name) 

Cũng có tag_name_with_index thuộc tính mà chấp nhận chỉ số như tham số đầu tiên. Ngoài ra cả hai tag_nametag_name_with_index có tham số tùy chọn multiple = false, được sử dụng cho mảng (chỉ cần thêm [] vào cuối tên được tạo).

Cuối cùng, có các phương pháp tương tự nếu bạn cần id thay vì tên - tag_idtag_id_with_index tương ứng.

+2

trong Rails 4.2.0, nó sẽ là 'ActionView :: Helpers :: Thẻ :: Base.new ( ActiveModel :: Naming.param_key (@ object_in_form_for), : your_attribute, : dummy ) .send (: tag_name) ' – gabe

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