2017-12-31 133 views
0

In einem meiner Modelle habe ich ein Feld namens token, das mit before_create erstellt wird. Es wird nie wieder geändert.Overriden Route ID Feld wird zurückgesetzt

In routes.rb ich verwende es anstelle von id, wie: resources :model, param: :token

So zum Beispiel der edit Route jetzt model/:token/edit ist.

In meinen Aktionen mache ich find_by(:token, params[:token]).

Ich habe ein Teilformular erstellt mit simple_form, die in den new und edit Aktionen geladen wird.

Das funktioniert gut, die Routen werden ordnungsgemäß generiert, alle zeigen :token: anstelle von :id.

Die show Aktion funktioniert gut. Auf der Show-Seite habe ich eine link_to, die auf die Bearbeitungsansicht verlinkt. Das funktioniert auch gut.

Beide verwenden :token in der Route, die Bearbeitungsansicht lädt die Modelle Felder, alles ist normal.

Wenn Sie jedoch den Quellcode für die Bearbeitungsansicht betrachten, wird die Aktion als /model/<id> anstelle von /model/<token> angezeigt. Zum Beispiel /model/5.

Wenn Sie das Bearbeitungsformular senden, versucht es, /model/5/ zu gehen.

Wenn ich zusätzlich die zu sendenden Parameter überprüfe, wird token auf den Wert id gesetzt. Irgendwie wurde das Feld token zurückgesetzt.

So

1) Das token Feld auf den Wert von id irgendwie wird zurückgesetzt. Ich habe keine Ahnung, wie das vor sich geht.

2) simple_form scheint die Aktion basierend auf id statt token zu generieren. Allerdings habe ich festgestellt, dass seit token zurückgesetzt wird, könnte es sein, dass simple_form ist nichts falsch machen und verwendet den Wert token.

Die einzige fix i mit, das url Feld in simple_form_for manuell unterging, aber wenn ich das tun einfiel, es bricht dann die new Aktion.

Für simple_form Ich bin nur tun: <%= simple_form_for @model do |f| %>

In routes.rb ich tue:

resources :model, param: :token 

In der Steuerung, die edit Aktion:

@model = Model.find_by(token: params[:token]) 

Die update Aktion ist:

@model = Model.find_by(token: params[:token]) 
if @mode.update model_params 
    redirect_to model_path @model.token 
else 
    render 'edit' 
end 

Nichts Besonderes im geringsten.

Antwort

2

Die simple_form verwendet das Standardverhalten von Rails beim Generieren der Routenzeichenfolge für Sie. Da die config/routes.rb nur die genannten Muster für die Outside In URL entsprechen, so ist es nicht zu viel Bedeutung für die Anwendung von innen. Für die Ex, mit einer Strecke wie dieser

model/:token/edit 

bedeutet nur eine beliebige Zeichenfolge zwischen model/ und /edit wird params[:token] zugeordnet werden. Es bedeutet nicht, dass die Zeichenfolge der Wert YourModel#token sein muss. Natürlich können Sie das Muster auf params[:foobar] auf die gleiche Weise model/:foobar/edit

etwas zuweisen kann vollständig ohne brechen Für durch token Schlüssel id Schlüssel zu ersetzen, müssen Sie YourModel#to_param

# app/models/your_model.rb 
class YourModel < ActiveRecord::Base 
    def to_param 
    token 
    end 
end 

Damit die ActiveSupport die Methode außer Kraft setzen wird wissen, token als den Wert zu verwenden, wenn Sie Leitwegmuster von innen heraus erzeugen.

Sie können an der mehr darüber lesen Rails's Guides

+0

Dieses es fixiert. Ich danke dir sehr. Ich habe das nirgends dokumentiert gesehen. – m5tt

+0

@ m5tt Ich habe das Referenzdokument hinzugefügt, falls Sie mehr darüber erfahren möchten. Fröhliches Hacken! – yeuem1vannam

+0

@ yeum1vannam Ich hätte nie gedacht, dort zu suchen. Ich habe das Gefühl, dass vielleicht etwas im Routing Guide erwähnt werden sollte, wo es um die Option "param" geht. Weil ich vermutete, dass ich "id" nicht richtig überschrieb, aber ich konnte nichts anderes finden, als diese "param" Option zu setzen. Danke noch einmal. – m5tt