Поле даты в Rails 3 остается пустым после отправки формы - PullRequest
2 голосов
/ 22 февраля 2011

Рельсы новичка здесь.

У меня есть 2 модели: Цель и Наблюдение

Цель работает отлично.Я создал леса для Observation, например:

rails generate scaffold Observation date:date target:references

Итак, app / models / наблюдение.rb говорит:

class Observation < ActiveRecord::Base
  belongs_to :target
end

Затем я отредактировал app / models / target.rb:

class Target < ActiveRecord::Base
  has_many :observations
end

В лесах было создано приложение / views / наблюдения / _form.html.erb, которое включает в себя:

<div class="field">
  <%= f.label :target %><br />
  <%= f.text_field :target %>
</div>

И приложение / контроллеры / наблюдение_controller.rb, которое включает в себя:

def create
  @observation = Observation.new(params[:observation])

Затем я иду, чтобы создать новое Наблюдение.Я ввожу дату и идентификатор цели в поле цели.Когда я отправляю, я получаю эту ошибку в браузере:

ActiveRecord::AssociationTypeMismatch in ObservationsController#create
Target(#2190392620) expected, got String(#2148287480)

Похоже, что леса установят что-то, что будет работать.Но ошибка имеет смысл.Он получает идентификатор цели вместо самой цели.Поэтому я отредактировал app / controllers / survey_controller.rb, чтобы сказать:

def create
  @target = Target.find(params[:observation][:target])
  @observation = @target.observations.create(:date => params[:observation][:date])

Теперь он создает запись наблюдения со ссылкой на цель.Но поле даты пустое.

Я понимаю, что это может быть глупый вопрос новичка или RTFM, но я бы очень признателен за указатель в правильном направлении.Спасибо.


Вот полное содержание формы, после ее изменения, чтобы отразить полученный ответ.

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

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

  <div class="field">
    <%= f.label :date %><br />
    <%= f.date_select :date %>
  </div>

  <div class="field">
    <%= f.label :target %><br />
    <%= f.collection_select :target_id, Target.all, :id, :name %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

Ответы [ 3 ]

1 голос
/ 22 февраля 2011

изменение

<%= f.text_field :target %>

до

<%= f.text_field :target_id %>

И действительно лучше использовать что-то вроде select для этой вещи. Как:

<%= f.collection_select :target_id, Target.all, :id, :title %>

UPD

Поскольку date_select помощник устанавливает не обычную группу переменных для каждого элемента (год, месяц, день), вы должны сделать это:

date = [ params[:observation]['date(1i)'], params[:observation]['date(2i)'], params[:observation]['date(3i)'] ].join(".")
@observation = @target.observations.create(:date => date)

На самом деле просто посмотрите на исходный код HTML, и вы увидите его

0 голосов
/ 16 декабря 2011

Вы можете использовать:

<%= collection_select(:observation, :target_id, Target.all, :id, :title %>

Я думаю, это поможет вам.

0 голосов
/ 11 ноября 2011

(Не уверен, что вы все еще отслеживаете это, OP? Для всех, кто приходит сюда через Google:)

Не будет params[:observation][:date], потому что даты вводятся с использованием нескольких полей ввода HTML, а затем волшебным образом объединяются в назначении. Ключевое слово для этого - «многопараметрические атрибуты», и это лучшее объяснение, которое я нашел:

Как на самом деле работают многопараметрические атрибуты ruby ​​на рельсах * (datetime_select)

Мне также интересно, сработает ли этот более простой фрагмент.

@observation = @target.observations.create(params[:observation])
...