2011-02-09 3 views
0

Я новичок в 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)

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

Пользователь (# 63152640) ожидается, получил String (# 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 
+1

показать ваш источник просмотра – fl00r

+0

будет делать, как только я получить домой – bruno077

ответ

0

Я понял это.

Оказывается, вид, производимую с подмостей, в поле пользователя было так:

<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

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

Однако, если вы действительно хотите, чтобы эти имена таблиц, то вы можете указать, что с 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 - это атрибут User, который будет значением параметра, и: name - это атрибут User, который будет отображаться в списке выбора. Если вы хотите отобразить другой атрибут пользователя в списке, то все, что вам нужно сделать, это изменить это.

+0

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

+0

Okey. FYI, вы отредактировали неправильные вещи. Названия классов в единственном числе, имена таблиц во множественном числе. Кроме того, я не могу думать ни о чем другом, что является неправильным без дополнительной информации, поэтому было бы хорошо, если бы вы могли предоставить действие контроллера, где вы пытаетесь создать объекты и, возможно, взгляды. – DanneManne

+0

Я только что понял, что я редактировал неправильные вещи. Исправлено еще раз: P проверяет реальный источник. – bruno077

Смежные вопросы