在Rails中的同一个控制器中调用一个动作

时间:2017-04-24 16:17:11

标签: ruby-on-rails

以下作品,但我想知道是否有更好的方法?在索引页面上,我们列出了小部件。您可以在其显示视图中编辑每个窗口小部件,但为了提高效率,我们希望通过向每个窗口小部件添加一个复选框,让用户能够从索引页面执行批量操作,然后收集选定的窗口小部件,将它们传递给控制器和'做东西'他们从控制器中一举失败。这是代码......

视图

<%= form_tag bulk_change_widgets_path(method: :post) do %>  
      <%- @widgets.each do |image| -%>
        ....
              <%= check_box_tag 'selected_widget_ids[]', widget.id -%>
          </td>
        </tr>
      <%- end -%>
      <%= submit_tag %> 
    <%- end -%>

控制器

action_one
  @widget = Widget.find(params[:id])
...
end

action_two
  @widget = Widget.find(params[:id])
...
end

def bulk_change_widgets
    selected_widgets = params[:selected_widget_ids]

    selected_widgets.each do |widget|
      params[:id] = widget
      action_one
      action_tow
    end

    redirect_to widgets_path
  end

action_one / two的现有结构需要保留在适当的位置,以容纳从每个窗口小部件的显示页面调用的实例方法。但是,在同一个控制器中以这种方式调用action_one / 2时,某些事情并没有感觉。有没有更好的,或 Rails方式来做到这一点?

1 个答案:

答案 0 :(得分:1)

这可能更有效率。不是多个查询来单独获取小部件,而是执行单个查询以获取所有小部件并使用此列表进行迭代。如果它太多的小部件ID并将它们加载到内存中是一个问题(我不认为是这种情况),你可以做find_each

  def bulk_change_widgets
    selected_widgets = Widget.where(:id => params[:selected_widget_ids])

    selected_widgets.each do |widget|
      widget.take_action
    end

    redirect_to widgets_path
  end

并且,正如评论所说,将方法移动到Widget类(胖模型,瘦控制器)。