关于Rails URL参数作为整数的问题

时间:2011-04-01 01:40:18

标签: ruby-on-rails

Extreme Rails新手在这里。我创建了一个由一堆问题组成的简单数据库。每个问题都有一个名为challengeNumber(一个整数)的属性,用于标识问题所属的挑战。

我的目标是将challengeNumber作为参数传递给网址,并仅返回与该质询编号匹配的问题。

我试过这段代码:

<h1>Challenge Test</h1>
<% @challenges.each do |challenge| %>
  <% if challenge.challengeNumber == (params[:challengeNumber]) %>
    <h3><%= challenge.questionText %></h3>
  <% end %>
<% end %>

但使用http://localhost:3000/?challengeNumber=1时没有返回任何内容。但是,如果我使用:

<h1>Challenge Test</h1>
<% @challenges.each do |challenge| %>
  <% if challenge.challengeNumber == Integer(params[:challengeNumber]) %>
    <h3><%= challenge.questionText %></h3>
  <% end %>
<% end %>

我得到了预期的结果(质询为1的问题返回)

我这样做是否正确?我想确保我使用正确的约定,我认为1的参数将作为整数传递,但它似乎作为字符串传递。将它转换为我的工作代码中显示的整数是正确的,还是我完全不在这里?

编辑添加:

以下是我实际设置的一些细节:

以下是挑战show.html.erb,让您了解结构:

<p id="notice"><%= notice %></p>

<p>
  <b>Challengenumber:</b>
  <%= @challenge.challengeNumber %>
</p>

<p>
  <b>Questionnumber:</b>
  <%= @challenge.questionNumber %>
</p>

<p>
  <b>Questiontext:</b>
  <%= @challenge.questionText %>
</p>

<p>
  <b>Answertext:</b>
  <%= @challenge.answerText %>
</p>


<%= link_to 'Edit', edit_challenge_path(@challenge) %> |
<%= link_to 'Back', challenges_path %>

所以,这个DB可以有这样的条目:

challengeNumber:1,questionNumber:1,questionText:“为什么?”,answerText:“因为” challengeNumber:1,questionNumber:2,questionText:“Who?”,answerText:“Me”

challengeNumber:2,questionNumber:1,questionText:“How?”,answerText:“Wish I know”

(我发现根据Danne的回复,命名约定是关闭的,一旦我解决逻辑就会修复)

所以我们的目标是将challengeNumber作为URL参数发送(http:// localhost:3000 /?challengeNumber = 1)并让它返回与该挑战号码相关的两个问题

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

有一些事情你应该改进,使它更多“Rails”。

首先,实际上没有必要从数据库加载所有挑战,然后循环遍历它们以查看哪一个是正确的。它会消耗更多的内存然后需要。现在我不知道你的代码在控制器中的样子,但我认为你做的是这样的事情:

@challenges = Challenge.all

应该改为

# Edit: Removed .first so that all matching challenges can be retrieved
@challenges = Challenge.where(:challengeNumber => params[:challengeNumber])

这样,只会从数据库加载正确的质询,您不必关心它是字符串还是整数。您可以将视图简化为:

<!-- Edit: Changed to looping though @challenges -->
<h1>Challenge Test</h1>
<% @challenges.each do |challenge| %> 
  <h3><%= challenge.questionText %></h3>
<% end %>

其次,这更像是遵循Rails惯例的提示。所有数据库字段都应该是小写的并用下划线分隔,所以我建议将challengeNumber重命名为challenge_number