更新フォームの次の奇妙な動作を誰かが説明できますか?
モデルpost.rbには次の定義が含まれています
class Post < ActiveRecord::Base attr_accessible :id, :name, :content validates :id, :presence => true, :numericality => { :greater_than_or_equal_to => 100}, :uniqueness => true end
コントローラposts_controller.rbは、この方法で更新メソッドを定義します
class PostsController < ApplicationController def update @post = Post.find(params[:id]) respond_to do |format| if @post.update_attributes(params[:post]) format.html { redirect_to @post, notice: 'Post was successfully updated.' } format.json { head :no_content } else format.html { render action: "edit" } format.json { render json: @post.errors, status: :unprocessable_entity } end end end
部分ビュー_form.rbには、scaffoldで生成された標準式も含まれています
<%= form_for(@post) do |f| %> ... <div class="field"> <%= f.label :id %><br /> <%= f.number_field :id %> </div> <div class="field"> <%= f.label :name %><br /> <%= f.text_field :name %> </div> <div class="field"> <%= f.label :content %><br /> <%= f.text_area :content %> </div> <div class="actions"> <%= f.submit %> </div> <% end %>
問題の説明:
- 更新フォームでは、:idの無効な値は42のように指定されます
- 検証ヘルパーは無効な入力値(<100)を処理し、「Idは100以上である必要があります」という通知を渡し、データは更新されません
- :idのフィールドは、123などの正しい値に置き換えられ、[投稿の更新]ボタンが再度送信されます。
フォームの受信とデータベースの更新の代わりに、Rails はPostsController#showで例外ActiveRecord::RecordNotFoundをスローします
id=42の投稿が見つかりませんでした
何が起きてる ?なぜ期待と古い値が再び渡されるのですか?