Вопрос о параметрах URL в Rails как о целых числах - PullRequest
0 голосов
/ 01 апреля 2011

Extreme Rails новичок здесь.Я создал простую базу данных, состоящую из множества вопросов.Каждый вопрос имеет атрибут challengeNumber (целое число), который определяет, к какому вызову относится вопрос.

Моя цель - передать challengeNumber в качестве параметра в URL-адресе и вернуть только те вопросы, которые соответствуют этому номеру вызова.

Я попробовал этот код:

<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 %>

Итак, эта БД может иметь такую ​​запись:

challengeNumber: 1, questionNumber: 1, questionText: «Почему?», AnswerText: «Потому что» challengeNumber: 1, questionNumber: 2, questionText: «Who?», AnswerText: «Me»

challengeNumber: 2, questionNumber: 1, questionText: «Как?», AnswerText: «Хотел бы я знать»

(я понимаю, что соглашения об именах отключены для ответа Данна, исправлю, как только я решу логику)

Итакцель состоит в том, чтобы отправить challengeNumber в качестве параметра URL (http://localhost:3000/?challengeNumber=1) и вернуть ему оба вопроса, связанные с этим номером вызова

Спасибо за любую помощь!

1 Ответ

1 голос
/ 01 апреля 2011

Есть несколько вещей, которые вы должны улучшить, чтобы сделать его более "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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...