web-dev-qa-db-fra.com

Méthode non définie avec "_path" lors de l'utilisation de Rails form_for

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 %>
32
Alekx

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'
26
Fábio Batista

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'
8
basgys

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é.

4
megas

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.

1
Doug