Pergunta

Eu sou novo para Ruby on Rails, eu ter concluído o Blog Tutorial .

Agora estou tentando adicionar uma ação adicional para o controlador, chamado de 'iniciar'.

def start
end

Eu adicionei uma página de visualização "app / views / posts / start.html.erb" contendo nada além de html simples.

Quando eu vou para / posts / start eu recebo o seguinte erro.

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

Eu entendo o erro, a ação show está sendo executado e início não é um ID válido. Por que não a ação start começar executado, há alguma parte da arquitetura ou configuração MVC que eu estou ausente?

Abaixo está a minha 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

Sim, eu ter reiniciado o servidor e tentei com Mongrel e webrick.

Foi útil?

Solução

A sua rota não está configurado para permitir que esse caminho. Supondo que você está usando o andaime padrão, colocou esta linha antes na linha map.resources :posts em config / routes.rb:

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

O regex para restringe :action-lo apenas a-z (para evitar a captura coisas como / posts / 1). Ele pode ser melhorado se você precisa sublinhados ou números em suas novas acções.

Outras dicas

O erro que você está fazendo é realmente um bem comum.

Basicamente, Rails mapeia automaticamente URLs para seus andaimes. Então, quando você criou os andaimes Mensagens, Rails é mapear as rotas de URL para ele. Um tal percurso é o URL para visualização de um único post: posts / / (post_id)

Assim, quando você está digitando a URL / posts / start Rails pensa que você está dizendo "Ei, dá-me o post com ID = começar. Então Rails reclama que o método show não pode encontrar um post com tal ID .

Uma maneira rápida de corrigir isso é para garantir que seu config / routes.rb tem o caminho para a ação de início antes das rotas de andaimes:

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

De qualquer forma, espero que ajude.

On Rails 4.x use:

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

On Rails 3.x uso:

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

em vez de

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

resolveu o meu problema.

Tente isto se você estiver usando rails 3.0.3

no seu route.rb

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

Isto pode ajudar

Eu quero dizer, às vezes Rails fica pegajosa com rotas em cache, mesmo no desenvolvimento meio ambiente.

Ela pode ajudar a reiniciar o servidor Rails . Isso tem funcionado para mim mais vezes do que posso contar quando receber este erro.

Isso funciona:

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

Eu encontrei a solução para o meu problema, no arquivo routes.rb onde

map.resource :post

Eu adicionei com o argumento coleção, por isso ficou assim:

map.resource :post, :collection => { :my_action => :get}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top