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)并让它返回与该挑战号码相关的两个问题
感谢您的帮助!
答案 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