tl; dr : Похоже, что params[:commit]
не содержит актуальную релевантную информацию для создания нового коммита, вместо этого он содержит только значение кнопки отправки для формы, имя которой также «совершить». Есть идеи, почему это происходит? Я ничего не менял.
Я запускаю rails 3 с сервером webrick, поскольку он отображает соответствующую информацию об отладке. Я создал модель только с одним атрибутом, description:text
, и, кажется, все работает нормально.
Однако, когда я собираюсь создать новый, используя автоматически сгенерированную форму скаффолдинга, его, похоже, не волнует значение текстовой области описания. Другими словами, после создания столбец created_at
в порядке, и все, кроме description
, вообще не отображаются. Вот вывод с сервера:
Started POST "/commits" for 127.0.0.1 at 2010-11-03 17:24:20 -0700
Processing by CommitsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"F00A8Ttv7ceREegfZmP+T5kr+6u2YbRJrQzmfEOaT7o=", "commit"=>"Create Commit"}
SQL (0.5ms) INSERT INTO "commits" ("created_at", "description", "updated_at") VALUES ('2010-11-04 00:24:20.986571', NULL, '2010-11-04 00:24:20.986571')
Redirected to http://0.0.0.0:3000/commits/5
Completed 302 Found in 42ms
Вот как выглядит моя миграция, автоматически сгенерированная rails generate
def self.up
create_table :commits do |t|
t.text :description
t.timestamps
end
end
Итак, как вы можете видеть, он видит значение описания как NULL
, хотя я что-то и набрал в текстовой области. Вот что рельсы сгенерировали в _form.html.erb
партиале:
<div class="field">
<%= f.label :description %><br />
<%= f.text_area :description %>
</div>
У кого-нибудь есть идеи относительно того, почему это происходит? Я уверен, что это тоже очевидная вещь.
Кстати, rails console
отлично работает, когда я его создаю и сохраняю вручную, поэтому у меня возникает ощущение, что в контроллере происходит отключение, когда он собирается сохранить или что-то в этом роде.
РЕДАКТИРОВАТЬ : Я заметил кое-что интересное. В контроллере объект создается так:
@commit = Commit.new(params[:commit])
Однако, как отмечено в выходных данных webrick выше, параметры, которые получает сервер, являются только:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"F00A8Ttv7ceREegfZmP+T5kr+6u2YbRJrQzmfEOaT7o=", "commit"=>"Create Commit"}
Так что не похоже, что он получает параметр description
, который, я думаю, должен был быть обернут в параметр commit
, но затем, если я посмотрю на источник для формы new
, он показывает, что текстовое поле описания имеет имя commit[description]
, но кнопка отправки имеет имя commit
. Так что каким-то образом он получает только значение кнопки отправки, которая действительно имеет значение «Создать коммит», а не другую информацию, которая ему требуется.
Я не так много знаю о рельсах, поэтому не знаю, так ли это на самом деле.
Кто-нибудь, пожалуйста, помогите мне, ха-ха.
РЕДАКТИРОВАТЬ : Здесь находится остальная часть _form.html.erb
, созданная рельсами. Возможно, вы можете заметить явную проблему:
<%= form_for(@commit) do |f| %>
<% if @commit.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@commit.errors.count, "error") %> prohibited this commit from being saved:</h2>
<ul>
<% @commit.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :description %><br />
<%= f.text_area :description %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
Ответ : Похоже, что Rails 3 теперь автоматически присваивает каждой кнопке отправки имя «commit», что противоречит названию моей модели. Я так боялся. Мне интересно, есть ли какие-либо дополнительные последствия использования этого имени. Эта проблема была решена путем явного изменения отправки вызова:
f.submit "Button Text", :name => "something_else"