1

Rails3でajax/jqueryを使用して別のコントローラーの新しいアクションをレンダリングする方法を知りたいです。

クライアントとセールスコントローラー、モデル、ビューがあるとしましょう。私がやりたいのは、ajax/jqueryを使用してクライアントのインデックスビューから新しい販売を行えるようにすることです。

このために、「新規販売」という名前の各クライアントの横にボタンがあります。クリックすると、そのクライアントの新しい販売を行うためのフォームがレンダリングされます。

私が考えていたのは、Salesコントローラーからnew_saleフォームをレンダリングするか、Clients viewsフォルダー内に作成された新しいsaleフォームをレンダリングし、Clientsコントローラー内に新しいアクションを作成して新しいsaleを作成することです。それができれば。

とにかく、私はその新しい販売フォームをレンダリングするためにアプローチする方法を知りたいです、何か考えはありますか?

前もって感謝します。

編集** これが私のコードです:

#clients index.html.erb
#I couldnt make work the link like you suggested so i did it like this
<%= link_to "Venta", { :controller => "sales", remote: true, :action => "new", :cliente_id => cliente.id, :class => 'btn btn-small btn-primary', :id => 'btn-venta-clientes-index'} %>

#Div where i want to render the new sale form
<div id="test" class="modal-body"></div>


#new.js.erb inside sales views folder, i tried with the 3 of them one at a time but none work
#$("div#test").html("<%= escape_javascript(j render :partial => "form") %>"); 
#$('div#test').html('<%= escape_javascript(render("form")) %>');
$('div#test').html('<%= j render :partial => "form" %>');


#Sales controller
#I tried removing all formats from the new action but didnt work
def new
  @sale = Sale.new
  @cliente = Cliente.find(params[:cliente_id])

  respond_to do |format|
    #format.html # new.html.erb
    #format.json { render json: @sale }
format.js
  end
end

#I tried removing all formats from the create action but didnt work
def create 
  @sale = Sale.new(params[:sale])

  respond_to do |format|
    if @sale.save
     #format.html { redirect_to @sale, notice: 'Sale was successfully created.' }
     #format.json { render json: @sale, status: :created, location: @sale }
 format.js  { render action: "create" }
    else
     #format.html { render action: "new" }
     #format.json { render json: @sale.errors, status: :unprocessable_entity }
 format.js  { render action: "new" }
    end
  end
end

私が間違っていることを知っていますか?

4

1 に答える 1

2

私が作った解決策であなたの状況を大まかにスケッチしました。何かが最適ではない、何かが間違っているかもしれませんが、言葉よりも一般的な考え方をよく理解していただければ幸いです。

#clients/index.haml
= render @clients


#clients/_client.haml
.client-container
  %p= client.name 
  ...
  .form-container{ :id => "client-#{client.id}" }
    = link_to "New sale", new_sale_path(:client_id => client.id), :remote => true

#SalesController
def new
  @sale = Sale.new
  @client = Client.find(params[:client_id])
end

#sales/new.js.erb
$("#client-<%= @client.id %>").html("<%= j render :partial => "form" %>");

#sales/_form.haml
#your form code

#SalesController
def create
  @sale = Sale.new(params[:sale])
  if @sale.save
    format.js { render action: "create"}
  else
    format.js { render action: "new" }
  end
end

#sales/create.js.erb
#Here you hide a form and write something like "success".
#You can return "new sale" button (if you decide to remove it.)

また、ajaxコールバックはこの状況で非常に役立ちます。例えば:

$('.your-remote-button').bind 'ajax:success', ->
  $(this).closest('div').fadeOut()
于 2012-05-30T16:25:59.410 に答える