0

Respond_withを使用してフォーム送信で次のアクションを実行できるようにしたい:

  1. 送信してからインデックスにリダイレクト
  2. 送信してからフォームにとどまる
  3. 作成したレコードを送信して表示する

Respond_with のデフォルト アクションは、show アクションにリダイレクトすることです。クリックされたボタンの種類に応じてコントローラーを応答させるにはどうすればよいですか?

これらの「送信」は、作成および更新アクション中に発生します。たとえば、このコードの作成アクションは、3 つの送信ボタン (送信して編集、送信して表示、送信してインデックスを表示) のいずれかがクリックされた場合にどのように応答しますか?

def new
    respond_with(@business=Business.new)
  end

  def create
    @business = Business.new(params[:business])
    flash[:notice] = t("flash.actions.create.notice", {:resource_name => "Business"}) if @business.save
    respond_with(@business)
  end
4

2 に答える 2

2

ビューでは、値submit_and_editsubmit_and_showを使用submit_and_show_indexして、コントローラーでこれを行います。

def create
  @business = Business.new(params[:business])
  flash[:notice] = t("flash.actions.create.notice", {:resource_name => "Business"}) if      @business.save
  location = case params[:submit]
  when 'submit_and_edit'
    edit_business_url
  when 'submit_and_show'
    business_url
  when 'submit_and_show_index'
    redirect_to businesses_url
  end
  respond_with(@business, :location => location)
end
于 2012-06-11T04:00:20.663 に答える
0

一般に、送信ボタンを 1 つだけにして、ユーザーが次に何が起こるかを期待できるようにすることをお勧めします (通常は、表示ページに移動します)。

3 つの送信ボタンが必要な場合は、Javascript を使用して、送信前にデータにフィールドを設定できます。HTML (ERB を想定) で、隠しフィールドと ID をボタンに追加します。

<%= hidden_field_tag :action, "", id='next_action' %>

<%= f.submit "Submit and Show, id='show' %>
<%= f.submit "Submit and Edit id='edit'%>
<%= f.submit "Submit and Index id='index'%>

次に、クリック ハンドラーを追加する必要があるため、.js.coffee で次のようにします。

$(":submit").click ->
    $('#next_action').val = $(this).attr('id')
    $(this).closest(':form').submit()

これにより、next_action' という ID を持つ隠しフィールドが検出され、その値がクリックされたボタンの ID に設定され、フォームが送信されます。

これでコントローラーにアクセスできるようにparams[:next_action]なり、そこから後続のページにリダイレクトできます。

于 2012-06-11T03:54:15.467 に答える