我正在尝试创建一个非常简单的词汇表webapp,它在前面(索引)页面上显示了一堆带有定义的单词。每个单词都有一个名为" knowledge,"其价值可以是"学习"或者"学会了。"
我想在索引页面的底部添加一个名为" Practice。"单击该链接将转到显示知识中第一个单词的单词和定义的页面:"学习"柱。然后会有一个" next"链接,带你到知识的下一个词:"学习"柱。当你的知识用完时:"学习"列,您将被带回索引页面。
我得到一个id =>零错误。问题似乎是单击练习链接将我发送到需要id的显示页面,但是我实际上并不查询数据库以确定第一个单词的id,直到我到达控制器中的show动作。如何链接到" show"专栏中的第一个单词?
"练习"索引页面上的链接如下所示:
<%= link_to 'Practice', page_path(@page) %>
我在路线文件中使用resources :pages
。
我的控制器页面中的show动作如下所示:
def show
if @page.nil?
@page = Page.where(knowledge: 'Learning').first
else
@next = Page.where("id > ?", params[:id]).order(:id).first
end
end
最后,我的展示页面看起来像这样:
<% if @page%>
<p> <%= @page.word %></p>
<p> <%= @page.content %></p>
<p><%= link_to "Next", page_path(@next) %></p>
<% elsif @next %>
<p> <%= @next.word %></p>
<p> <%= @next.content %></p>
<p><%= link_to "Next", page_path(@next) %></p>
<% else %>
<p> Good Job!</p>
<p><%= link_to "Home", pages_path %> </p>
<%end%>
错误信息是:
No route matches {:action=>"show", :controller=>"pages", :id=>nil} missing required keys: [:id].
该错误突出显示了我的索引模板中的这一行:
<%= link_to 'Practice', page_path(@page) %>
*请注意,我对编程和rails非常陌生。这可能很简单。
答案 0 :(得分:1)
一般来说,在没有要显示的对象的情况下链接到“show”动作是个坏主意。这就是“索引”行动的用途。
尝试像这样链接:
<%= link_to 'Practice', pages_path %>
然后在你的控制器中执行以下操作:
def index
page = Page.where(knowledge: 'Learning').first
redirect page_path(page)
end
这样,在调用show动作时,您将始终拥有一个ID。我想您还需要调整show方法,以便{/ 1}}和@page
可供您查看。
@next
答案 1 :(得分:0)
欢迎使用Rails!
页面路径需要一个id。如果您进入项目文件夹并键入rake routes,它将显示您的路由列表以及哪些需要ID。像这样:
user GET /users/:id(.:format) users#show
您需要获取第一条记录并将其加载到索引页面中:
def index
@page = Page.where(knowledge: 'Learning').first
end
然后是索引页面上的链接:
<%= link_to 'Practice', page_path(@page, first: true) %>
first:true是您可以在show动作中检查的第二个参数,以便您可以判断此人是否来自索引页。
然后为你的节目动作 - (params总是返回一个字符串,这就是为什么,'true'在你的节目动作的引号中)
def show
if params[:first] == 'true'
@page = Page.where(knowledge: 'Learning').first
@next = Page.where("id > ?", @page.id).order(:id).first
else
@page = Page.where("id > ?", params[:id]).order(:id).first
@next = Page.where("id > ?", @page.id).order(:id).first
end
end
供您查看:
<% if @page%>
<p> <%= @page.word %></p>
<p> <%= @page.content %></p>
<p><%= link_to "Next", page_path(@next) %></p>
<% else %>
<p> Good Job!</p>
<p><%= link_to "Home", pages_path %> </p>
<%end%>
你也可以查看will_paginate gem的分页:https://github.com/mislav/will_paginate