Rails - 你如何"展示"一个页面,如果你不知道ID?

时间:2015-05-15 22:48:58

标签: ruby-on-rails

我正在尝试创建一个非常简单的词汇表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非常陌生。这可能很简单。

2 个答案:

答案 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