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