6

Ich habe eine ziemlich einfache (ich denke) Single-Table-Vererbung (STI) Setup in meiner Rails App.Rails form_for das verwendet STI Basisklasse

Es gibt ein Benutzermodell mit einem verschachtelten Ressourcenpost. Mit STI, ich habe es so, dass einige Post sein kann :: Dringende Objekte.

Ich bemerkte, dass mein URL Helfer wie <%= [@user, @post] %> benötigten hartcodiert zu <%= user_post_path[@user, @post] %> oder sonst würde ich Fehler zu sehen, über Rails nicht die user_post_urgent_path Methode am Ende der Suche zu sein. Okay, das war ziemlich einfach.

(Eine alternative Möglichkeit, dies zu tun, ist auch <%= [@user, post: @post] %>.)

Nun, aus irgendeinem Grunde ist ich, um herauszufinden, nicht in der Lage, wie die form_for Verfahren in gleicher Weise angepasst zu machen. Wenn ich schreibe einfach

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

, bekomme ich Ähnliche Fehler auf den Fall URL Helfer, sondern in Form Kontext: undefined method 'user_post_urgen_path'.

ich dies durch die Angabe festgelegt:

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

ist aber nicht vollständig funktioniert, denn wenn ich das Formular zu gehen, ich Probleme in meinem Controller bekommen, sagen, dass starke Parameter Leitung params.require(:post) fehlgeschlagen:

param is missing or the value is empty: post 

Wenn ich die params finde ich prüfen, dass das Formular ein post_urgent Objekt ist vorbei und keine post Objekt.

Ich könnte natürlich manuell einige Logik, die immer sagt if !params[:post] and params[:post_urgent], then params[:post] = params[:post_urgent]. Aber das scheint nur Weg zu hacky, vor allem für Rails.

Gibt es einen besseren Weg, um ein Formular wie dieses "einfach funktionieren" zu machen, unabhängig davon, welche Unterklasse des Post-Modells es tatsächlich ist?

Antwort