2010-10-31 6 views
5

ho una visione sul mio progetto attuale, che fa qualcosa di simile al seguente (in Haml):generazione di ID HTML uniche in Rails quando si utilizza un parziale ripetuto che ha form_for

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

L'nel _votingbox.html. file di Haml ho il seguente:

%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 

Questo genererà il codice di lavoro, ma lo fa generare forme con lo stesso iD per tutti gli elementi del modulo che rende valido il codice HTML una volta che il votingbox parziale viene reso una seconda volta.

La mia prima supposizione a risolvere questo è stato quello di specificare un unico: id per form_for ma che si applica solo al tag form generato da form_for e non uno qualsiasi dei tag all'interno del blocco form_for.

Una soluzione definitiva a questo problema è quella di passare e definire manualmente i miei ID univoci su form_for e tutti gli elementi del modulo che utilizzo. Questo è più lavoro di quanto avessi sperato.

C'è un modo più semplice o più semplice per ottenere ID univoci in un formato simile al modo in cui Rails li genera attualmente su tutti i miei elementi del modulo?

risposta

1

Ho rimosso la risposta originale in quanto è totalmente irrilevante per la versione aggiornata della domanda.

Aggiornamento: Così ora sappiamo che si dispone di un oggetto ActiveRecord non salvato passato alla chiamata form_for, la risposta diventa semplice: è possibile ignorare qualsiasi parametro che form_for genera. Questo include l'id dell'elemento. E fields_for imposta il contesto per un record specifico.

= 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 in questo scenario restituirà sempre "Vote.new", che sarà un oggetto ActiveRecord non salvato. Ho modificato di conseguenza la domanda originale. Ciò che sarebbe ideale qui è se potessi generare i form id in base all'ID dell'oggetto horse. In questa situazione l'id per il modulo sarebbe 'vote_new_1' per quando quel partial è reso per l'oggetto Horse con id 1. – cyberkni

+0

Ho aggiornato la risposta, per favore vedi. – edgerunner

+1

Posso suggerire: ': id => dom_id (horse, 'vote')' per generare 'horse_123_vote'. È più facile da leggere. – Ariejan

1

È possibile ignorare i generati automaticamente id s e name s di tutti form_for contenuti con :as come la seguente:

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

Quindi, se un dato horse.name è foobar, verrà generato un campo di commento il cui id è foobar_comment e il nome è foobar[comment]

Ma ricordarsi di assicurarsi che t il parametro dinamico è accettabile come id HTML, un horse.name come hor$e non è accettabile come id html e quindi potrebbe rompere qualcosa.

P.S: Ci scusiamo per aver risposto molto tardi, ma al momento della domanda è stato chiesto, non ho imparato nulla circa le rotaie! spero che possa aiutare qualcuno là fuori!