2011-08-11 18 views
6

私は現在、私が編集または新しいアクションを行っている場合、それを送信するボタンを変更しようとしているいくつかのフォームを持っています。私は2つのフォームを作成しましたが、これは悪臭があり、今はただ1つのフォームの部分を使用しています。Rails 3 - フォーム、アクションに基づいたカスタム送信ボタン?

私の部分の終わりに、私は自分のフォームの終わりに、このような何かを持っている:

<p> 
    <% if controller.action_name == 'new' %> 
    <%= f.submit "Create", :class => "pink_button"%> or 
    <% elsif controller.action_name == 'edit' %> 
    <%= f.submit "Update", :class => "pink_button"%> or 
    <% end %> 
    <%= link_to "cancel", :back %> 
    </p> 

そのように私はいくつかの新しいを作成していた場合、ボタンは、「作成」を読み、もしユーザーが完了しようとしている更新プログラムで、「更新」ボタンが表示されます。フォームが送信され、検証が失敗するまで、これはうまくいきます。私のコントローラで

、私はそうのように失敗しないものをキャッチしています:

def update 
    @list = current_user.lists.find(params[:id])  

    if @list.update_attributes(params[:list]) 
     redirect_to list_path(@list), :notice => "List '#{@list.name}' updated." 
    else 
     render :action => 'edit' 
    end 
    end 

ので、フォームが単に再レンダリングです。問題は、私はもはや編集パスではないということです。つまり、フォームボタンが表示されなくなります。

私は何をしようとしていますか?

ありがとうございました

答えて

14

はい、これはデフォルトでi18nのRailsで処理されます。翻訳はActionViewにあり、次のようになります。すべてを行う必要があるf.submit

en: 
    helpers: 
    select: 
     # Default value for :prompt => true in FormOptionsHelper 
     prompt: "Please select" 

    # Default translation keys for submit FormHelper 
    submit: 
     create: 'Create %{model}' 
     update: 'Update %{model}' 
     submit: 'Save %{model}' 

(など、「作成」または「編集」介さず)と翻訳が残りの作業を実行します。上記のyamlをローカルロケールにドロップすることで上書きすることができます。

クラスを設定する必要がある場合は、nilを渡すことができます(例: f.submit nil, :class => 'whatev'

13

Railsの方法は、レコードが新規であるかどうかチェックすることです:

@list.new_record? ? "Create" : "Update" 
+2

おかげサミールを参照してください、詳細は

= f.submit (@list.persisted? ? 'Create' : 'Update') 

を使用!私はあなたの提案をこのように使用しました:<%= f.submit @ chore.new_record? ? "あなたの雑用を投稿する": "あなたの雑用を更新する"、:class => "marginTopBottom"%> –

0

Railsはオブジェクトが持続しているかどうかを判断する方法persisted?を持っています。

あなたはERBを使用している場合は、HAMLを使用している場合

<%= f.submit (@list.persisted? ? 'Create' : 'Update) %> 

を行い、http://apidock.com/rails/ActiveRecord/Persistence/persisted%3F