Вставить значение, соответствующее внешнему ключу в View (выполнение приложения)? - PullRequest
0 голосов
/ 09 февраля 2011

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

Я создаю систему отслеживания смен сотрудников, поэтому у меня есть две таблицы: пользователи и смены с этими ассоциациями

class User < ActiveRecord::Base
  has_many :shifts
end

class Shift < ActiveRecord::Base
  belongs_to :user
end

Я также добавил соответствующий user_id в модель смены при создании базы данных SQLite.

Моя проблема заключается в том, что при попытке вставить новую запись с помощью нового представления поле "user_id" неправильно проверяет любой действительный номер user_id, который я пытаюсь записать. Что я должен вставить в это поле? (В моем текущем запущенном приложении в Java это поле будет принимать значение user_id)

При попытке вставить любое значение в поле «пользователь» в представлении «сдвиги» я получаю следующую ошибку

Ожидается пользователь (# 63152640), получен Строка (# 19315740)



Вот источник просмотра

new.html.erb

<h1>New shift</h1>

<%= render 'form' %>

<%= link_to 'Back', shifts_path %>

_form.html.erb

<%= form_for(@shift) do |f| %>
  <% if @shift.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@shift.errors.count, "error") %> prohibited this shift from being saved:</h2>

      <ul>
      <% @shift.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :start %><br />
    <%= f.datetime_select :start %>
  </div>
  <div class="field">
    <%= f.label :end %><br />
    <%= f.datetime_select :end %>
  </div>
  <div class="field">
    <%= f.label :status %><br />
    <%= f.text_field :status %>
  </div>
  <div class="field">
    <%= f.label :user %><br />
    <%= f.text_field :user %> //<-- What should I write here? User_id?
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

(Все это было создано с помощью строительных лесов) Кроме того, новое действие в shifts_controller

def new
 @shift = Shift.new
end

Ответы [ 2 ]

0 голосов
/ 09 февраля 2011

Я понял это.

Получается представление, созданное с помощью лесов, в поле пользователя было так:

<div class="field">
    <%= f.label :user %><br />
    <%= f.text_field :user %> //<-- What should I write here? User_id?
  </div>

Я изменил :user для :user_idи это сработало.Я проверил запись 1 в поле user_id, и он сохранился правильно.

Затем в index.html.erb я изменил shift.user в списке на shift.user.username и теперь списокпоказывает мне, какая смена принадлежит тому или иному пользователю правильно

0 голосов
/ 09 февраля 2011

По вашему вопросу ваши таблицы называются user и shift. Это не стандартное соглашение по именованию рельсов. Все имена таблиц должны быть во множественном числе, чтобы пользователи и смены. Вы можете обойти это, если придется, но я бы не советовал.

Однако, если вы действительно хотите сохранить эти имена таблиц, вы можете указать это с помощью set_table_name следующим образом:

class User < ActiveRecord::Base
  set_table_name 'user'
  has_many :shifts
end

class Shift < ActiveRecord::Base
  set_table_name 'shift'
  belongs_to :user
end

Edit:

Если вы хотите иметь лучший способ контролировать, для какого пользователя предназначен сдвиг, то для ручного ввода идентификатора вы можете использовать помощника выбора в ваших представлениях. Возможно так:

  <div class="field">
    <%= f.label :user_id %><br />
    <%= f.select :user_id, options_from_collection_for_select(User.all, :id, :name) %>
  </div>

Ключ должен использовать помощник options_from_collection_for_select. User.all загружает всех пользователей, и у каждого пользователя будет один вариант выбора. : id - это атрибут пользователя, который будет значением параметра, а: name - это атрибут пользователя, который будет отображаться в списке выбора. Если вы хотите отобразить другой атрибут пользователя в списке, все, что вам нужно сделать, это изменить его.

...