tl;dr: кажется, что params[:commit]
не содержит актуальной информации для создания нового коммита, вместо этого он содержит только значение кнопки отправки для формы, имя которой также "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
отлично работает, когда я создаю его и сохраняю вручную, поэтому у меня такое ощущение, что в контроллере происходит отключение, когда он переходит к сохранению или что-то в этом роде.
EDIT: я заметил кое-что интересное. В контроллере объект создается как таковой:
@commit = Commit.new(params[:commit])
Однако, как отмечено в выходных данных webrick выше, сервер получает только следующие параметры:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"F00A8Ttv7ceREegfZmP+T5kr+6u2YbRJrQzmfEOaT7o=", "commit"=>"Create Commit"}
Таким образом, не похоже, что он получает параметр description
, который, как я полагаю, должен был быть заключен в параметр commit
, но затем, если я посмотрю на источник формы new
, он покажет, что текстовая область описания имеет имя commit[description]
, но кнопка отправки имеет имя commit
. Так что каким-то образом он получает только значение кнопки отправки, которая действительно имеет значение «Создать фиксацию», а не другую требуемую информацию.
Я не так много знаю о рельсах, поэтому я действительно не знаю, так ли это или что.
Кто-нибудь, пожалуйста, помогите мне, ха-ха.
EDIT: вот остальная часть партиала _form.html.erb
, сгенерированного rails. Возможно, вы заметите вопиющую проблему:
<%= 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", которое конфликтует с названием моей модели. Я так же боялся. Мне интересно, есть ли какие-либо дальнейшие последствия использования этого имени. Эта проблема была решена путем явного изменения вызова submit на:
f.submit "Button Text", :name => "something_else"