从Rails中的update方法渲染索引视图?

时间:2014-07-16 20:00:48

标签: ruby-on-rails

我正在尝试从索引视图中通过AJAX 更新用户,所以我有以下视图:

<% @users.each do |user| %>
    <tr>
      <td><%= user.email %></td>
      <td>
        <%= form_for [:admin, user], :remote => true, :authenticity_token => true, :format => :json do |f| %>
          <%= f.radio_button :approved, true, :checked => user.approved, :id => "user_approved_#{user.id}", :onclick => "this.form.submit();"%> Yes
          <%= f.radio_button :approved, false, :checked => !user.approved, :id => "user_not_approved_#{user.id}", :onclick => "this.form.submit();" %> No
        <% end %>
      </td>
    </tr>
  <% end %>

我有控制器更新方法,如下所示:

def update
    @user = User.find(params[:id])
    respond_to do |format|
      if @user.update(user_params)
        format.json { render nothing: true }
      else
        format.json { render nothing: true}
      end
    end
  end

即使记录得到正确更新,它也会呈现一个带有以下URL的空白页面:admin/users/2.json或者任何id都是刚更新的记录。

任何想法我怎样才能让它只呈现提交表单的索引视图?

3 个答案:

答案 0 :(得分:0)

您应该将您的onclick处理程序从this.form.submit()更改为$(this).closest("form").trigger("submit");

如你所知,你现在直接提交表格,所以jquery-ujs无法处理这个事件。

答案 1 :(得分:0)

<强> JS

首先,我不明白完全你想要实现的目标

我猜测您是否正在尝试捕获您刚刚发送的更新数据?如果是这种情况,我不会使用json MIME类型;相反,我只会发送一个简单的JS请求。

JSON mime类型主要用于API s之类的 - 其中使用json结构回调注释的对象。如果您尝试执行除响应中显示JSON数据之外的其他操作,您将会让自己陷入困境


<强>渲染

可能正在寻找以下内容:

#app/views/controller/your_view.html.erb
<%= form_for [:admin, user], :remote => true, :authenticity_token => true do |f| %>

#app/controllers/users_controller.rb
Class UsersController < ApplicationController
   def update
      respond_to do |format|
         format.js   { render :index }
         format.json { render json: index_path.to_json }
      end
   end
end

<强>修正

根据您的说法,您似乎希望能够执行以下操作:

#app/assets/javascripts/application.js
$(document).on("ajax:success", "#your_form", function(data, status, xhr){
    document.location.href= data; //have to find a way to use data's index path reference
});

答案 2 :(得分:-1)

在您的网页上添加此JavaScript代码段:

$("form").on("ajax:complete", (xhr, status) ->
  location.reload();
)

您可能希望使用ajax:success和ajax:error而不是ajax:complete。

如果未使用AJAX,则可以在更新后重定向到索引页面:

def update
  @user = User.find(params[:id])
  @user.update(user_params)
  redirect_to :action => :index
end