我正在研究Rails 5.2.0。我正在开发一个简单的简单应用程序,以使自己对任何新事物都沾沾自喜(主要在带有Rails 3和4应用程序的生产环境中工作)。
我在索引路径上,呈现类似
<ul>
<% @questions.each do |question| %>
<li><%= link_to question.title, questions_path(question.id) %></li>
<% end %>
</ul>
我的控制器看起来像
def index
@questions = Question.all
end
def new
@question = Question.new
end
def create
@question = Question.new(title: params['question']['title'], body: params['question']['body'])
if @question.save
redirect_to '/'
else
redirect_to '/questions/new'
end
end
def show
@question = Question.find(params[:id])
end
我的路线看起来像
get '/' => 'questions#index'
get '/questions/new' => 'questions#new'
post '/questions' => 'questions#create'
get '/questions/:id' => 'questions#show'
这很好,但是当我单击索引中的链接时,得到的路径为http://localhost:3000/questions.8
,而当我运行rails routes
时,得到
Prefix Verb URI Pattern Controller#Action
GET / questions#index
GET /questions/:id(.:format) questions#show
questions_new GET /questions/new(.:format) questions#new
questions POST /questions(.:format) questions#create
,如果您注意到它没有为表演路线生成路径。唯一有效的方法就是在索引中执行类似的操作
<% @questions.each do |question| %>
<li><%= link_to question.title, "/questions/#{question.id}" %></li>
<% end %>
这很好,但是却破坏了这些路线的全部目的。
有人看到我在做什么错或遗忘吗?这是5件事,还是我的代码中有些愚蠢?
答案 0 :(得分:1)
您的问题是questions_path
路由到/questions
,所以当您这样做时,
link_to question.title, questions_path(question.id)
您将获得/questions
,并在{{1}之后附加question.id
(因为.8
不需要参数)。
相反,您不应该这样做:
questions_path
哪个会给你:
root 'questions#index'
resources :questions
(如果愿意,您可以使用 root GET / questions#index
questions GET /questions(.:format) questions#index
POST /questions(.:format) questions#create
new_question GET /questions/new(.:format) questions#new
edit_question GET /questions/:id/edit(.:format) questions#edit
question GET /questions/:id(.:format) questions#show
PATCH /questions/:id(.:format) questions#update
PUT /questions/:id(.:format) questions#update
DELETE /questions/:id(.:format) questions#destroy
或:only
修剪路线。)
然后您可以做:
:except
铁路应该从<ul>
<% @questions.each do |question| %>
<li><%= link_to question.title, question %></li>
<% end %>
</ul>
变量中推断出正确的路线,并按照docs所述创建到question
的链接。
答案 1 :(得分:0)
您应将表演路线定义为
get '/questions/:id' => 'questions#show', :as => :question
然后将其用作question_path(question)
(注意不要复数),因为到questions_path
的路由已经使用了questions#index
。
但是,如果您想使用更清洁的解决方案,最好使用Rails的路线帮助器方法resources
。
resources :questions, :only => [:index, :new, :create, :show]