6

Ho un'impostazione di ereditarietà a tavolo singolo (STI) piuttosto semplice nella mia app Rails.Rails form_per quelli usa la classe base STI

Esiste un modello utente con una risorsa nidificata. Usando STI, ho fatto in modo che alcuni messaggi possano essere oggetti Post :: Urgent.

ho notato che i miei aiutanti URL come <%= [@user, @post] %> dovevano essere hard-coded per <%= user_post_path[@user, @post] %> altrimenti sarei andato a finire visto errori su Rails non trovare il metodo user_post_urgent_path. Ok, era ragionevolmente facile.

(Un modo alternativo di fare questo è anche <%= [@user, post: @post] %>.)

Beh, per qualche motivo non sono in grado di capire come rendere il metodo form_for regolato allo stesso modo. Quando scrivo semplicemente

<%= form_for [@user, @post] do |f| %> 

, ricevo un errore simile al caso URL aiutante, ma nel contesto modulo: undefined method 'user_post_urgen_path'.

Ho fissato questo specificando:

<%= form_for [@user, @post], url: :user_post do |f| %> 

ma questo non del tutto funziona, perché quando vado a presentare il modulo, ho dei problemi nel mio controller, dicendo che i parametri forte linea params.require(:post) fallito:

param is missing or the value is empty: post 

Se ispezionare il params trovo che la forma sta passando un oggetto post_urgent e non un oggetto post.

Potrei, naturalmente, inserire manualmente una logica che dice sempre if !params[:post] and params[:post_urgent], then params[:post] = params[:post_urgent]. Ma questo sembra solo way troppo hacky, specialmente per Rails.

C'è un modo migliore per rendere una forma come questa "funziona" indipendentemente da quale sottoclasse del modello di post in realtà si trova?

risposta