2010-10-31 27 views
5

tôi có một cái nhìn về dự án hiện tại của tôi mà làm điều gì đó như sau (trong Haml):Tạo id HTML duy nhất trong Rails khi sử dụng một phần lặp đi lặp lại rằng có form_for

[email protected] do |horse| 
    = render :partial => 'main/votingbox', :locals => {:horse => horse} 

Các trong _votingbox.html. tập tin Haml tôi có như sau:

%div.votingbox 
    %span.name= horse.name 
    %div.genders 
    - if horse.male 
     %img{:src => 'images/male.png', :alt => 'Male'} 
    - if horse.female 
     %img{:src => 'images/female.png', :alt => 'Female'} 
    %div.voting_form 
    = form_for(Vote.new, {:url => horse_vote_path(horse)}) do |f| 
     = f.label :comment, "Your opinion" 
     = f.text_field :comment 
     ... 
     a bunch of labels and input elements follow generated using the form helpers 

Điều này sẽ tạo ra mã làm việc nhưng nó tạo ra các forms với id tương tự cho tất cả các yếu tố hình thức mà làm cho HTML mất hiệu lực khi votingbox phần được trả lại lần thứ hai.

Đoán đầu tiên của tôi khi sửa lỗi này là chỉ định duy nhất: id thành form_for nhưng chỉ áp dụng cho thẻ biểu mẫu được tạo bởi form_for chứ không phải bất kỳ thẻ nào trong khối form_for.

Một giải pháp xác định cho vấn đề này là đi qua và xác định thủ công các id duy nhất của riêng tôi trên form_for và tất cả các phần tử biểu mẫu mà tôi sử dụng. Đây là công việc nhiều hơn tôi đã hy vọng.

Có cách nào dễ dàng hơn hoặc sạch hơn để có được các id duy nhất ở định dạng tương tự như cách Rails hiện đang tạo chúng trên tất cả các phần tử biểu mẫu của tôi không?

Trả lời

1

Tôi đã xóa câu trả lời ban đầu vì nó hoàn toàn không liên quan đến phiên bản cập nhật của câu hỏi.

Cập nhật: Vì vậy, bây giờ chúng ta biết rằng bạn có một đối tượng ActiveRecord chưa được lưu truyền cho form_for cuộc gọi, câu trả lời trở nên đơn giản: Bạn có thể ghi đè lên bất kỳ thông số mà form_for tạo ra. Điều đó bao gồm id phần tử. Và fields_for đặt bối cảnh cho một bản ghi cụ thể.

= form_for(Vote.new, :url => horse_vote_path(horse), :id => dom_id(horse, 'vote')) do |f| 
    = f.fields_for horse, :index => horse do |fh| 
    = fh.text_field :whatever 
    … 
+0

get_vote trong trường hợp này sẽ luôn trả về 'Vote.new' sẽ là đối tượng ActiveRecord chưa được lưu. Tôi đã sửa đổi câu hỏi gốc cho phù hợp. Điều gì lý tưởng ở đây là nếu tôi có thể tạo các id biểu mẫu dựa trên id của đối tượng ngựa. Trong trường hợp này, id cho biểu mẫu sẽ là 'vote_new_1' khi phần đó được hiển thị cho đối tượng Ngựa có id 1. – cyberkni

+0

Tôi đã cập nhật câu trả lời, vui lòng xem. – edgerunner

+1

Tôi đề nghị: ': id => dom_id (ngựa, 'bỏ ​​phiếu')' để phát triển 'horse_123_vote'. Nó dễ đọc hơn. – Ariejan

1

Bạn có thể ghi đè lên autogenerated id s và name s của tất cả form_for nội dung với :as như sau:

= form_for(Vote.new, :as => horse.name, {:url => horse_vote_path(horse)}) do |f| 
    = f.label :comment, "Your opinion" 
    = f.text_field :comment 

Vì vậy, nếu một cho horse.namefoobar, nó sẽ tạo ra một lĩnh vực bình luận mà idfoobar_comment và tên là foobar[comment]

Nhưng hãy nhớ đảm bảo t mũ tham số động được chấp nhận dưới dạng id html, horse.name như hor$e không được chấp nhận dưới dạng id html và do đó có thể phá vỡ điều gì đó.

P.S: Xin lỗi vì đã trả lời rất muộn, nhưng tại thời điểm câu hỏi được hỏi, tôi chưa học được gì cả về đường ray! hy vọng rằng có thể giúp ai đó ra khỏi đó!

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