Rails アプリには、AJAX を使用してコントローラーの新規作成、編集、更新アクションに応答する単純なリモート フォーム ロジックがあります。私form_for...remote => true
は format.js で応答しますが、成功した create-action には応答しません。すべてに同じフォーム部分を使用し、更新アクションは .js で応答し、作成アクションは保存が成功しなかった場合にのみ .js で応答します。新しいアイテムに対して有効なフォームを送信すると、アプリはActionController::UnknownFormatエラーをスローします。これは、成功した create-action だけにどのように関係するのでしょうか?
と が含まれて<%= javascript_include_tag 'application' %>
おり<%= csrf_meta_tags %>
、以下が私のコードです。
フォーム部分:
# variable remote_form is true
<%= form_for(shop_item, :remote => remote_form, :authenticity_token => true) do |f| %>
...
<% end %>
コントローラ:
def create
@shop_item = ShopItem.new(shop_item_params)
if @shop_item.save
respond_to do |format|
format.js do
flash.now[:success] = "New Item #{@shop_item.title} created"
end
end
else
respond_to do |format|
format.js { render 'new' }
end
end
end
def edit
@shop_item = ShopItem.find(params[:id])
respond_to do |format|
format.js
end
end
def update
@shop_item = ShopItem.find(params[:id])
if @shop_item.update_attributes(shop_item_params)
@shop_item.reload
respond_to do |format|
format.js do
flash.now[:success] = "Updated #{@shop_item.title}"
end
end
else
respond_to do |format|
format.js { render 'edit' }
end
end
end
create.js.erb:
if ($('#flashes').length > 0) {
$('#flashes').replaceWith('<%= j(render :partial => "shared/flashes") %>');
} else {
$('#session').append('<%= j(render :partial => "shared/flashes") %>');
}
$('#shop-items').prepend('<%= j(render @shop_item) %>');
サーバ:
ActionController::UnknownFormat (ActionController::UnknownFormat):
app/controllers/shop_items_controller.rb:20:in `create'
...
ありがとう!