Подтвердить что ты не робот

Undefined метод с "_path" при использовании рельсов form_for

Я использую ошибку маршрутизации (я думаю) при использовании Rails form_for helper. Я искал и посмотрел на этот вопрос, но множественное число для "static_event" с плюрализацией - "static_events", поэтому я нахожусь в убытке. Любая помощь будет оценена. Вот подробности....

ActionView::Template::Error (undefined method `static_events_path' for #<#<Class:0x007f9fcc48a918>:0x007f9fcc46fa78>):

Моя модель:

class StaticEvent < ActiveRecord::Base
attr_accessible :content, :title, :discount, :location, :day_of_week, :start_time

Мой контроллер:

    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

Маршрут:

match '/static-events/new', :to => 'static_events#new'
match '/static-events/',     :to => 'static_events#index'
match '/static-events/:id', :to => 'static_events#show'

Вид

<%= 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 %>
4b9b3361

Ответ 1

Автоматически называются только маршруты, созданные с помощью метода resources.

Если вы хотите назвать свои маршруты, используйте опцию :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

Однако лучше использовать метод resources. Вы должны передать "истинное" имя вашей модели в качестве первого параметра, затем переопределите путь, если хотите:

resources :static_events, :path => 'static-events'

Ответ 2

Прежде всего, вы должны определить свои маршруты таким образом:

resources 'static-events', :only => [:new, :create]

Это создаст маршрут для новых и создаст методы.

Потому что, когда вы используете новый объект ActiveRecord в качестве аргумента для формы, он будет искать * s_path как static_events_path в вашем файле маршрутов с помощью глагола POST.

Я думаю, что способ, которым вы определили свои маршруты, не создает static_events_path с помощью POST-глагола (вы можете проверить это, используя маршруты рейка, как сказал megas). Поэтому больше не используйте совпадение, используйте ресурсы или получайте /post/... вместо соответствия вашим проектам Rails 3.

ИЗМЕНИТЬ

Я не заметил вчера, но нет пути для создания метода. Добавьте маршрут ниже до static_events # index или удалите все ваши маршруты и сделайте, как я сказал выше.

post '/static-events/', :to => 'static_events#create'

Ответ 3

Запустите rake routes, и вы увидите список своих маршрутов. Затем вы можете исправить файл маршрута, чтобы иметь соответствующий маршрут маршрута.

Ответ 4

Это случилось со мной, когда я использовал вложенный ресурс, но забыл инициализировать родительский ресурс, используя load_and_authorize_resource в cancan. Следовательно, родительский ресурс был пустым, и эта ошибка была сброшена.

Я исправил это, объявив load_and_authorize_resource родительского элемента в контроллере.