Forum: PC-Programmierung RubyOnRails: resources und Verlinkung


von Be B. (bebo)


Lesenswert?

Hallo zusammen,

ich habe hier ein Problem, bei dem ich nicht weiterkommen.

Folgende Routen ist gegeben:
1
  resources :users do
2
    get :send_activation_email, :on => :member
3
  end

Das get in der 2. Zeile fügt eine Route hinzu, die folgendes Format hat.
localhost/users/:id/send_activation_email

Wenn ich aber später irgendwo Verlinken will
1
<%= url_for send_activation_email_path(@user)  %>

ist der erzeugte Pfad immer /users/send_activation_email/:id .

Wie ist der offizielle Weg einen Pfad zu erzeugen (url_for, link_to,...) 
ohne den Pfad von Hand zusammen zu bauen?

Danke und Grüße

von D. I. (Gast)


Lesenswert?

<%= link_to "Linkname", send_activation_email_path(@user) %>

oder mit absolutem pfad:

<%= link_to "Linkname", send_activation_email_url(@user) %>

von Be B. (bebo)


Lesenswert?

Ok, ich muß mich etwas korrigieren.

Wenn ich die Route mit
1
match "/users/:id/send_activation_email", :to => "users#send_activation_email", :as => :send_activation_email
definiere, dann klappt es tatsächlich, so wie Du es beschrieben hast.

Was ist aber, wenn ich die Route mit
1
  resources :users do
2
    get :send_activation_email, :on => :member, :as => :send_activation_email
3
  end
definiere? Ich habe es zuerst ohne :as und dann aus Verzweiflung noch 
mal mit :as probiert. Aber weder in dem einen noch in dem anderen Fall 
ist send_activation_email_path (oder url) definiert.
Fehlermeldung: undefined method `send_activation_email_path' for 
#<#<Class:0x3dbb1a8>:0x3ada378>

von D. I. (Gast)


Lesenswert?

Be Bo schrieb:
> Ok, ich muß mich etwas korrigieren.
>
> Wenn ich die Route mitmatch "/users/:id/send_activation_email", :to => 
"users#send_activation_email", :as => :send_activation_emaildefiniere, dann klappt 
es tatsächlich, so wie Du es beschrieben hast.
>
> Was ist aber, wenn ich die Route mit  resources :users do
>     get :send_activation_email, :on => :member, :as => :send_activation_email
>   enddefiniere? Ich habe es zuerst ohne :as und dann aus Verzweiflung noch
> mal mit :as probiert. Aber weder in dem einen noch in dem anderen Fall
> ist send_activation_email_path (oder url) definiert.
> Fehlermeldung: undefined method `send_activation_email_path' for
> #<#<Class:0x3dbb1a8>:0x3ada378>

weils user_send_activation_mail_path(id) heißt, da die aktion innerhalb 
der ressource definiert wurde

Btw. ein "rake routes" auf der konsole gibt dir alle routen die in 
routes.rb definiert sind aus :) Unglaublich nützlich.

Der Routenmechanismus in Rails ist schon ziemlich mächtig, da lässt sich 
verrücktes Zeug machen, z.b.:
1
games_hash = {
2
  1 => 'treasurechest',
3
  2 => 'breelight',
4
  3 => 'sudetris',
5
  4 => 'codebreaker',
6
  5 => 'pichack',
7
  6 => 'quadripartite',
8
  7 => 'rotator',
9
  8 => 'bree_mines',
10
  9 => 'calculus',
11
  10 => 'biologicus',
12
  11 => 'cuboidal',
13
  12 => 'double_lock'
14
}
15
16
resources :games, :only => [:index, :show] do
17
  get 'stat', :on => :member
18
  put 'reset', :on => :collection
19
20
  games_hash.each do |game_id, controller|
21
    resources :usergames, :controller => "games/#{controller}",
22
              :constraints => lambda { |req| req.params[:game_id].to_i == game_id }, :only => [:show, :create, :destroy] do
23
      post 'move', :on => :member
24
      put 'accept', :on => :member
25
    end
26
  end
27
end

von Be B. (bebo)


Lesenswert?

Jetzt klappt es.

Danke D. I.

von Be B. (bebo)


Lesenswert?

Vielleicht noch eine kleine Frage:

Wie kann ich diese Route
1
match "/users/:id/activate/:activation_code", :to => "users#activate", :as => :activate

in das Resource Model einbetten.
1
 resources :users do
2
   get :send_activation_email, :on => :member, :as => :send_activation_email
3
 end

von D. I. (Gast)


Lesenswert?

Be Bo schrieb:
> Vielleicht noch eine kleine Frage:
>
> Wie kann ich diese Route
> match "/users/:id/activate/:activation_code", :to => "users#activate", :as => 
:activate
> in das Resource Model einbetten.
>  resources :users do
>    get :send_activation_email, :on => :member, :as => :send_activation_email
>  end

Puuh kann ich dir adhoc jetzt nicht sagen, aber ich vermute etwas in der 
Richtung:
1
resources :users do
2
  get "activate/:activation_code", :on => :member
3
end

Hier ein bisschen Lektüre:

http://guides.rubyonrails.org/routing.html

von Be B. (bebo)


Lesenswert?

Mit
1
 get 'activate/:activation_code', :on => member, :action => :activate, :as => :activate
 geht's.

von D. I. (Gast)


Lesenswert?

Be Bo schrieb:
> Mit
1
 get 'activate/:activation_code', :on => member, :action =>
2
> :activate, :as => :activate
 geht's.

das :as ist redundant, aber ja das :action braucht man in dem Fall, sagt 
einem sogar rake routes.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.