Добавление действия к существующему контроллеру (Ruby on Rails)
Я новичок в Ruby on Rails, я завершил Blog Tutorial.
Теперь я пытаюсь добавить дополнительное действие к контроллеру, называемому "start".
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 выполняется и запуск не является допустимым ID. Почему не запускается действие запуска, есть ли какая-то часть архитектуры MVC или конфигурации, которую я пропускаю?
Ниже мой post_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.
Ответы
Ответ 1
Ваша маршрутизация не настроена, чтобы разрешить этот маршрут. Предполагая, что вы используете строительные леса по умолчанию, поместите эту строку перед строкой map.resources :posts
в config/routes.rb:
map.connect "posts/:action", :controller => 'posts', :action => /[a-z]+/i
Регулярное выражение для :action
ограничивает его только a-z (чтобы избежать попадания таких вещей, как /posts/ 1). Его можно улучшить, если вам нужны символы подчеркивания или числа в ваших новых действиях.
Ответ 2
Ошибка, которую вы делаете, на самом деле довольно распространенная.
В основном, Rails автоматически отображает URL-адреса для ваших лесов. Поэтому, когда вы создавали строительные леса Posts, Rails сопоставляет маршруты URL для него. Одним из таких маршрутов является URL-адрес для просмотра одного сообщения:/posts/(post_id)
Итак, когда вы входите в URL/posts/start, Rails думает, что вы говорите: "Эй, дай мне сообщение с идентификатором = начало. Поэтому Rails жалуется, что метод show не может найти сообщение с таким идентификатором.
Один быстрый способ исправить это - убедиться, что ваш config/routes.rb имеет маршрут для начала действия перед маршрутами лесов:
# Route for start action
map.connect '/posts/start', :controller => 'posts', :action => 'start'
# Default mapping of routes for the scaffold
map.resources :posts
В любом случае, надеюсь, что это поможет.
Ответ 3
В 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'
он решил мою проблему.
Ответ 4
Попробуйте, если вы используете рельсы 3.0.3
в вашем маршруте. rb
resource :posts do
collection do
get 'start'
end
end
это может помочь
Ответ 5
Я хочу сказать, иногда Rails становится липким с кэшированием маршрутов, даже в среде разработки.
Это может помочь перезагрузить сервер Rails. Это работало для меня больше времени, чем я могу рассчитывать при получении этой ошибки.
Ответ 6
Это работает:
map.resource :post, :collection => { :my_action => :get}
Ответ 7
Я нашел решение своей проблемы в файле routes.rb, где
map.resource :post
Я добавил с аргументом коллекции, поэтому он остался следующим образом:
map.resource :post, :collection => { :my_action => :get}