Adicionando uma ação a um controlador existente (Ruby on Rails)
-
03-07-2019 - |
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.
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}