2011-02-01 21 views
2

私はRails 2.3.8を使用しています。新しい/作成、編集/更新のためにRailsがリダイレクトを作成

フォームでエラーが発生した後にレンダリングされる動作に問題があります。

だから私はpostsコントローラと定期的な関連アクション、indexnewcreateeditupdate、およびshowを持っています。ここで

PostsControllerのフォームとアクションは、次のとおりです。

<% form_for(@post, :html => {:multipart => true}) do |f| %> 
    <%= f.error_messages %> 
    # Form fields and stuff 
    <%= f.submit "Create New Post" %> 
<% end %> 

edit.html.erb

def new 
    @post = Post.new 
    # other setup 
end 

def create 
    if request.post? 
    @post= Post.new(params[:post]) 
    # other setup for save 
    if @post.save 
     flash[:notice] = 'Post was successfully created.' 
     redirect_to campaign_path(@post, :redirect => "create") 
    else 
     render :action => 'new' 
    end 
    end 
end 

def edit 
    @post = Post.find(params[:id]) 
    # other setup 
end 


def update 
    # setup for save 
    if @campaign.update_attributes(params[:post]) 
    flash[:notice] = 'Your post was successfully updated.' 
    redirect_to :action=> "index" 
    else 
    render :action => "edit" 
    end 
end 

そしてここでは、ビュー

new.html.erbのフォームがある

<% form_for(@post, :html => {:multipart => true}) do |f| %> 
    <%= f.error_messages %> 
    # Form fields and stuff 
    <%= f.submit "Update This Post" %> 
<% end %> 

私の問題はです:もし私がnewページにいて、何らかのエラー(例:フィールドを空のままにしておきます)、レンダリングされたビューは間違った場所に送信されます。だから私がnewで始まり、何度もうまくいかなかった場合は、new、次にcreate、次にedit、そしてupdateというアクションで私を連れて行きます。だから、動作は次のとおりです。

はポストを作成して開始します。

処置:new
URI:/posts/new
レンダリング ビュー:失敗show
を提出しに行く:create

成功 new
が提出は、に行きます

最初に失敗した送信後:

アクション:create
URI:/postsが悪いですか?レンダリング
ビュー:index(これはフォームがupdateアクション、悪いに提出されることを意味)
失敗を提出しに行く::第二の失敗が提出した後edit悪い

new
成功を提出しに行きます:

アクション:edit悪い、私はここから01になるべきではありません!
URI:レンダリング/posts/[id]
ビュー:edit悪い、私はnewからここに来ることができないはずです!成功 が提出
は、に行く:アップデートを通じてindex
失敗提出行くまで:3回目以降の失敗した送信した後update

処置:update悪い、私はからここに来ることができないようにする必要がありnew
URI:レンダリング/posts/[id]
ビュー:edit悪い、私はnewからここに来ることができないはずです!誰もが私が間違ってやっているものに私を指すことができれば、私は感謝しupdate

:成功
は、に行く投稿:失敗index
を提出しに行きます。追加情報が必要な場合は、尋ねてください。

ありがとうございます!

答えて

1

おそらく問題は、あなたの投稿を作成するために使用しているコードです(保存するための#設定)。あなたはおそらく@ post.idを設定しています。これはあなたの新しいフォームが作成の代わりに更新するために提出する原因となります。 form_forヘルパーは、レコードが新規かどうかをチェックし、レコードが新規の場合はそれを作成し、すでに存在する場合は更新に送信します。

注:request.postを確認する必要もありません。あなたの作成アクションで。作成アクションは常にポストリクエストでなければなりません。

+0

がない場合は、elseなし特にそのrequest.post?の必要は捕獲しないために@post = Post.new(params [:post]) '私はまた' update_attribute'を実行します。それを保存するために 'Post.new'に電話する必要はありませんか?明確にするために、どこかで明示的にidを指定することはしませんが、ある時点で自動的に作成されると思います。 –

+0

update_attributeを呼び出すと、投稿がそこに保存される可能性があります。最初のチェックは、update_attributeが成功しないことです。そうでない場合は、次のアクションで更新を実行していて、作成を実行していません。 –

+0

あなたは絶対に正しいです。私は新しい投稿を作成すると、更新属性を削除し、paramsハッシュの変更を 'merge!'に変更しました。本当にありがとう! –

0

あなたのルートはどのようなものですか?

とパンが言ったように、それは私が私がセットアップに何をすべきかの要旨は `create`にラインを追加しました post?

関連する問題