RubyOnRails: resources und Verlinkung

#3009499
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
#3009675
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>
Gast #3009723
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
Gast #3009817
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren