Je rencontre une erreur de routage (je pense) lors de l'utilisation de l'aide de formulaire_pour Rails. J'ai cherché autour et regardé cette question , mais le pluriel de "static_event" avec pluralize est "static_events", je suis donc perdue. Toute aide serait appréciée. Voici les détails....
ActionView::Template::Error (undefined method `static_events_path' for #<#<Class:0x007f9fcc48a918>:0x007f9fcc46fa78>):
Mon modele:
class StaticEvent < ActiveRecord::Base
attr_accessible :content, :title, :discount, :location, :day_of_week, :start_time
Mon contrôleur:
class StaticEventsController < ApplicationController
before_filter :authenticate, :only => [:create, :destroy]
before_filter :authorized_user, :only => [:destroy]
def new
@title = "Share An Event"
@static_event = StaticEvent.new
end
def create
@static_event = current_user.static_events.build(params[:event])
if @static_event.save
flash[:success] = "Event Shared"
redirect_to @static_event #this was the old version
else
render :new
end
end
La route:
match '/static-events/new', :to => 'static_events#new'
match '/static-events/', :to => 'static_events#index'
match '/static-events/:id', :to => 'static_events#show'
La vue
<%= form_for (@static_event) do |f| %>
<%= render 'shared/error_messages', :object => f.object %>
<%= text_field "static_event", "title", "size" => 48 %>
<%= time_select "static_event", "start_time", {:ampm => true, :minute_step => 15} %>
<%= text_area "static_event", "content", "cols" => 42, "rows" => 5 %>
<%= text_field "static_event", "discount", "size" => 48 %>
<%= text_field "static_event", "location", "size" => 48 %>
<%= text_field "static_event", "day_of_week", "size" => 48 %>
<input name="" type="submit" class="button" value="share on chalkboard" />
<% end %>
Seuls les itinéraires créés à l'aide de la méthode resources
sont automatiquement nommés.
Si vous souhaitez nommer vos itinéraires, utilisez l'option :as
:
match '/static-events/new', :to => 'static_events#new', :as => :new_static_event
match '/static-events/', :to => 'static_events#index', :as => :static_events
match '/static-events/:id', :to => 'static_events#show', :as => :static_event
Cependant, il est préférable d'utiliser la méthode resources
. Vous devez passer le nom "true" de votre modèle en tant que premier paramètre, puis remplacer le chemin si vous le souhaitez
resources :static_events, :path => 'static-events'
Tout d’abord, vous devez définir vos itinéraires de la manière suivante:
resources 'static-events', :only => [:new, :create]
Cela créera un itinéraire pour de nouvelles méthodes et créera.
En effet, lorsque vous utilisez un nouvel objet ActiveRecord en tant qu'argument, il recherche * s_path comme static_events_path dans votre fichier de routage avec le verbe POST.
Je pense que la façon dont vous avez défini vos routes ne crée pas le static_events_path avec le verbe POST (vous pouvez le vérifier en utilisant des routes de rake comme le dit megas). Alors n'utilisez plus match, utilisez les ressources ou get/post/... au lieu de correspondre dans vos projets Rails 3.
MODIFIER
Je n'ai pas remarqué hier, mais il n'y a pas de voie pour la méthode create. Ajoutez la route ci-dessous avant static_events # index ou supprimez toutes vos routes et faites comme je l’ai dit ci-dessus.
post '/static-events/', :to => 'static_events#create'
Exécutez rake routes
et vous verrez la liste de vos itinéraires. Ensuite, vous pouvez corriger le fichier de route pour avoir le chemin de route approprié.
Cela m'est arrivé lorsque j'utilisais une ressource imbriquée, mais j'ai oublié d'initialiser la ressource parent à l'aide de load_and_authorize_resource
dans cancan. Par conséquent, la ressource parent était null et il a renvoyé cette erreur.
Je l'ai corrigé en déclarant load_and_authorize_resource
sur le parent dans le contrôleur.