Добавление действия к существующему контроллеру (Ruby on Rails)

StackOverflow https://stackoverflow.com/questions/401241

Вопрос

Я новичок в 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}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top