Ruby on rails 多个提交按钮

Ruby on rails 多个提交按钮,ruby-on-rails,ruby,forms,Ruby On Rails,Ruby,Forms,我正在尝试为一个表单创建多个提交按钮,但不断出现以下错误: Couldn't find User with id=edit_individual 位于: # Use callbacks to share common setup or constraints between actions. def set_user @user = User.find(params[:id]) end 我的控制器页面: def edit_individual if User.find_by_id

我正在尝试为一个表单创建多个提交按钮,但不断出现以下错误:

Couldn't find User with id=edit_individual
位于:

# Use callbacks to share common setup or constraints between actions.
def set_user    
@user = User.find(params[:id])
end
我的控制器页面:

def edit_individual
  if User.find_by_id (params[:user_ids])
    if params[:Delete_multiple]
      @users = User.find(params[:user_ids])
      @users.each do |user|
        user.destroy
      end
      redirect_to :back, notice: 'All selected users were successfuly deleted'
    else
      @users = User.find(params[:user_ids])
    end
  else
    redirect_to :back, alert: 'No users were selected for editing'
  end
end

def update_individual

  @users = User.update(params[:users].keys, params[:users].values).reject { |p| p.errors.empty? }
    if @users.empty?
      redirect_to :back, notice: "Users updated"
    else
    render :action => "edit_individual"
    end

end
我的索引页:

<%= form_tag edit_individual_users_path do %>
<table class="table table-hover">
  <thead>
    <tr>
      <th></th>
      <th><%= sort_link @q, :firstName, "First name" %></th>
      <th><%= sort_link @q, :lastName, "Last name" %></th>
      <th><%= sort_link @q, :registrationNumber, "Registration number" %></th>
      <th><%= sort_link @q, :email, "Email" %></th>
      <th></th>
     </tr>
  </thead>
  <tbody>
    <% @users.each do |user| %>
    <% if (user.archive == false) %>
      <tr>
      <td><%= check_box_tag "user_ids[]", user.id %></td>
      <td><%= user.firstName %></td>
      <td><%= user.lastName %></td>
      <td><%= user.registrationNumber %></td>
      <td><%= user.email %></td>
      <td><%= link_to 'View', user, class: 'btn btn-info btn-mini', title: 'View users\'s information' %></td>
      <td><%= link_to 'Edit', edit_user_path(user), class: 'btn btn-warning btn-mini', title: 'Edit users\'s information', method: 'get' %></td>
      <td><%= link_to 'Delete', user, class: 'btn btn-danger btn-mini', title: 'Delete user', method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
    <% end %>
  </tbody>
  </table>
  <p><%= select_tag :field, options_for_select([["All Fields", ""], ["First name", "firstName"], ["Last name", "price"], ["Registration number", "registrationNumber"], ["Email", "email"]]) %></p>

<p><%= submit_tag "Edit checked", name: 'Edit_multiple' %></p>
<p><%= submit_tag "Delete checked", name: 'Delete_multiple', data: { confirm: 'Are you sure you want to delete multiple users?' } %></p>
<% end %>
删除部分工作正常。此外,编辑部分实际上编辑该字段,但显示该错误(因此它不会重定向回索引页,从而使其看起来不好)

有人能帮我修一下吗?花了很多时间让
编辑
删除
,所以如果我不得不删除编辑部分,那就太糟糕了


编辑1:另外,如果我正在编辑例如3个用户,并单击“提交”按钮,仅允许2/3通过(由于验证),则没有错误(我只是被重定向回
EDIT_individual.html以完成最后一个用户),然后如果我再次单击“提交”,所有内容都通过,我发现了一个错误。

我实际上已经找到了问题所在。 问题在于:

def update_individual

  @users = User.update(params[:users].keys, params[:users].values).reject { |p| p.errors.empty? }
  if @users.empty?
    redirect_to :back, notice: "Users updated"
  else
    render :action => "edit_individual"
  end

end
而不是:

redirect_to :back
应该是:

redirect_to users_path

或者其他固定的路径。有没有办法保持“redirect_to:back”,或者我必须为将使用此方法的其他视图(在同一控制器内)创建新方法?

不应该运行此方法,因为您没有任何
参数[:id]

如果您在筛选之前使用用户,则

before_filter: set_user except: [:update_individual, :edit_individual]

def set_user    
 @user = User.find(params[:id])
end

当您在
edit\u individual

中调用
update\u individual
时,您不能在表单上创建多个提交按钮,因为提交按钮将在定义的操作中提交表单。您可以添加多个按钮并通过javascript处理提交功能。您可以这样做,只需定义按钮的名称,然后使用“if语句”,就像我在控制器中使用它一样(if参数[:button_name]@Meldanen:那么,实际上,你只有一个提交按钮是正确的。那么,你怎么能说你在表单中使用了两个提交按钮呢?haSabyasachi Ghosh是正确的。@RajeshCO不,在这种情况下,他们确实会在页面上呈现两个提交按钮。
params
散列将包含clic按钮的
名称
ked,他们在控制器中检查。只提交了两个按钮名称中的一个。Ryan Bates在中介绍了这一点。尽管如此,我已经很长时间没有看到/使用这种方法了;这是我发现的pre-Rails 3系统的典型特征,通常不推荐。@Meldanen这主要是一个约定问题。“问题”你会有一个控制器动作执行两个独立的功能。它可能会很混乱,并导致fat控制器,这最终会降低可维护性、清晰度和关注点的分离。至于另一个选择,我不太确定你的情况,因为我不清楚“编辑”是如何检查的这个概念应该行得通。一般来说,可能会找到一种方法来分离批量删除和批量编辑。否则,我不太确定,因为我看不到整个系统。小错误:
users\u ath
应该是
users\u path
(我想)。至于你的问题,我不确定我是否理解你所说的“back function”是什么意思,但如果您的意思是在发生错误时呈现/重定向到同一页面,那么更大的问题是您的路由和操作不是RESTful的;因此通常在这种情况下,您只需按照约定执行类似于
render:edit
的操作,但在您的情况下,您确实必须指定要呈现/重定向的路由/操作我认为你问题的第二部分是肯定的。假设我理解正确。是的,我想你理解我的意思。时间有点晚了(早上6点),所以我为我的错误措辞道歉^^谢谢你的帮助!
redirect_to users_path
before_filter: set_user except: [:update_individual, :edit_individual]

def set_user    
 @user = User.find(params[:id])
end