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

Добавление действия к существующему контроллеру (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.

4b9b3361

Ответ 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}