Добавление действия в существующий контроллер (Ruby on Rails) - PullRequest
36 голосов
/ 30 декабря 2008

Я новичок в Ruby on Rails, я закончил Учебник блога .

Сейчас я пытаюсь добавить в контроллер дополнительное действие, которое называется «Пуск».

def start
end

Я добавил страницу просмотра "app / views / posts / start.html.erb", не содержащую ничего, кроме простого html.

Когда я захожу в / posts / start, я получаю следующую ошибку.

ActiveRecord::RecordNotFound in PostsController#show 
Couldn't find Post with ID=start

Я понимаю ошибку, действие show выполняется, и start не является допустимым идентификатором. Почему не запускается стартовое действие, какая-то часть архитектуры или конфигурации MVC мне не хватает?

Ниже находится мой posts_controller.rb

class PostsController < ApplicationController

  # GET /posts/start
  def start
  end

  # GET /posts
  # GET /posts.xml
  def index
    @posts = Post.find(:all)
    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @posts }
    end
  end

  # GET /posts/1
  # GET /posts/1.xml
  def show
    @post = Post.find(params[:id])
    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @post }
    end
  end

end

Да, я перезапустил сервер и попробовал его с Mongrel и webrick.

Ответы [ 7 ]

45 голосов
/ 30 декабря 2008

Ошибка, которую вы делаете, на самом деле довольно распространенная.

По сути, Rails автоматически сопоставляет URL-адреса ваших скаффолдов. Поэтому, когда вы создали скаффолды Posts, Rails отображает маршруты URL для него. Одним из таких маршрутов является URL для просмотра одного сообщения: / posts / (post_id)

Итак, когда вы вводите URL / posts / start, Rails думает, что вы говорите: «Эй, дайте мне сообщение с ID = start. Поэтому Rails жалуется, что метод show не может найти сообщение с таким ID» .

Один из быстрых способов исправить это - убедиться, что в вашем файле config / rout.rb есть маршрут для действия запуска перед маршрутизацией лесов:

# Route for start action
map.connect '/posts/start', :controller => 'posts', :action => 'start'
# Default mapping of routes for the scaffold
map.resources :posts

В любом случае, надеюсь, это поможет.

33 голосов
/ 28 сентября 2011

В Rails 4.x используйте:

get '/posts/start', :controller => 'posts', :action => 'start'

В Rails 3.x используйте:

match '/posts/start', :controller => 'posts', :action => 'start'

вместо

map.connect '/posts/start', :controller => 'posts', :action => 'start'

это решило мою проблему.

26 голосов
/ 30 декабря 2008

Ваш маршрут не настроен для разрешения этого маршрута. Предполагая, что вы используете стандартные леса, поместите эту строку перед строкой map.resources :posts в config / rout.rb:

map.connect "posts/:action", :controller => 'posts', :action => /[a-z]+/i

Регулярное выражение для :action ограничивает его только a-z (чтобы не ловить такие вещи, как / posts / 1). Его можно улучшить, если вам нужны подчеркивания или цифры в ваших новых действиях.

8 голосов
/ 29 декабря 2010

Попробуйте, если вы используете рельсы 3.0.3

в вашем маршруте. Rb

 resource :posts do
   collection do
     get 'start'
   end
 end

это может помочь

2 голосов
/ 10 августа 2011

Хочу сказать, что иногда Rails не справляется с кэшированием маршрутов, даже в среде development .

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

1 голос
/ 16 февраля 2010

Это работает:

map.resource :post, :collection => { :my_action => :get}
0 голосов
/ 22 июля 2009

Я нашел решение моей проблемы в файле rout.rb, где

map.resource :post

Я добавил с аргументом коллекции, поэтому он остался таким:

map.resource :post, :collection => { :my_action => :get}
...