質問
tl; dr: : のようです params[:commit]
新しいコミットを作成するための実際の関連情報は含まれていません。代わりに、名前も「コミット」されているフォームの送信ボタンの値のみが含まれています。なぜこれが起こっているのかについてのアイデアはありますか?私は何も変えませんでした。
関連するデバッグ情報が表示されるため、Webrick ServerでRails 3を実行しています。属性が1つだけのモデルを作成しました。 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は、すべての送信ボタンに「コミット」の名前を自動的に提供するように見えます。これは私のモデルの名前と競合します。私は同じように恐れました。この名前を使用することにさらに影響があるのではないかと思います。この問題は、提出コールを明示的に変更することで解決されました。
f.submit "Button Text", :name => "something_else"
解決
デフォルトでは、Railsの足場は、次のようなものになるフォームを作成します。
<%= form_for @commit do |f| %>
<%= f.label :description %>
<%= f.text_area :description %>
<%= submit_tag "Create" %>
<% end %>
部分的なコンテンツをフォーム自体に崩壊させたことに注意してください。理解すべき重要なことは、これが起こったときにHTMLが生成されるものです。次のようになります:
<form action="/commits/create" method="post">
<label for="commit_description">Description:</label>
<textarea id="commit_description" name="commit[description]"></textarea>
<input name="commit" type="submit" value="Create" />
</form>
あなたが出くわすゴッチャは、送信ボタンの名前とオブジェクトの名前の間の名前の衝突です。通常、Railsが「コミット[説明]」のようなフォーム名に遭遇すると、結果が@paramsに保存され、値が次のようになります。
@params[:commit] = { :description => 'value' }
実際、それがRailsがしたことです。問題は、「submit_tag」フォームヘルパーによって生成されたデフォルト名も「コミット」と呼ばれることでした。したがって、Railsがそのフォームパラメーターに遭遇したとき、次のようなフォームの結果を上書きしました。
@params[:commit] = "Create" # same name as the value of the submit button
この名前の衝突を回避するには、いくつかのオプションがあります。最初のオプションは、Plane Old HTMLに送信ボタンを手渡すことです。確かにいくつかのオプションを失いますが、少なくとも送信ボタンの名前を他のものに変更できます。
<input type="submit" name="who_cares" value="Create Commit" />
もう1つのオプションは、「form_for」ヘルパーのバリエーションを使用することです。この場合、フォームのオープニングラインは次のようになります。
<%= form_for :newcommit, @commit, :url => { :action => "create" } do |f| %>
<%= f.label :description %>
<%= f.text_area :description %>
<%= submit_tag "Create" %>
<% end %>
これにより、結果のHTMLが次のようになります。
<form action="/commits/create" method="post">
<label for="newcommit_description">Description:</label>
<textarea id="newcommit_description" name="newcommit[description]"></textarea>
<input name="commit" type="submit" value="Create" />
</form>
これにより、フォームデータは@params [:newcommit]パラメーターにバインドされ、通常のように処理を続けることができます。
あなたのさらなる読書の楽しみのために:
他のヒント
form_forのような名前のフィールドを生成します commit[description]
。ただし、最後のsubitボタンにはの名前があります commit
。最後の送信ボタンが前面を上書きしたと思います commit[]
s。
試してみてください <%= f.submit "Your button text", :name => "something_else" %>