Ruby on Rails,submit_tag有3个复选框

时间:2013-05-14 11:18:03

标签: ruby-on-rails checkbox submit-button

我需要一些like this但在Ruby On Rails中。 我有一个代码,用于选择要删除或分析的特定文件:

<% if @files%>    
<%= form_tag what_to_do_files_path, method: :get do %>
<%= submit_tag "Delete selected", :name => 'delete' %>
<%= submit_tag "Analyse", :name => 'analyse' %>
  <% @files.each do |file| %>
    <% if (arraydb.file=="no") %>
        <p><td> <%= check_box_tag "files[]", file.id %></td><%= file.name %></p>       

    <% else %>      

    <div class="my_profile_info">     
    <p><td> <%= check_box_tag "files[]", file.id %></td> <%= file.name %></p>        

    <td class="Info">
    <a href="<%=file.info%>" target ="_blank" class= "btn btn-mini btn-info">Info</a>  
    </td>  

     </div>

    <% end %>
  <%end%>
<%end%> 
<%else%>
<%end%>

路线:

resources :files do
      collection do             
        get :what_to_do      
      end
    end

控制器:

def what_to_do
  method=params[:commit]
    if method == 'Delete selected'
     do smt

   elsif  method == 'Analyze'
     do another thing
   end
end

我需要的是“分析”按钮的选项。像图片,信息,规范化,带有复选框的散点图。 因此,我选择图片和标准化并点击“分析”,因此只会进行两个选项。我不太确定如何将复选框包装到submit_tag。

修改

实施例
选择选项(复选框)

  • 正常化
  • 产品图
  • 散点图
  • 信息

选择文件(复选框):

  • File1中
  • 文件2
  • 文件3

5 个答案:

答案 0 :(得分:3)

如果我理解你的目标,我不是100%肯定,但这是我的理解:

您可以使用复选框选择一堆文件,还需要选项复选框以将其他选项传递给Analyze操作?

只需在form_tag中添加:

<%= check_box_tag "pictures", true %>
<%= check_box_tag "normalization", true %>

等等。

在您的控制器中:

elsif method == "Analyze"
 if params[:pictures]
  do picture stuff
 if params[:normalization]
  do normalization stuff
等等等 如果选中该复选框,params [:nameofcheckboxtag]将被设置为值(第二个选项,在我的示例中为true),否则它将不存在。无论哪种方式,仅使用此示例处理选中的选项。

答案 1 :(得分:1)

对于您的情况,我认为您必须选择一组提交按钮(文件/选项)。你应该做这样的事情:

<强>控制器:

  def update  
    @counter = Counter.find(params[:id])
      # here we need to check which button is pressed & based on that call that particular method, either update file/option.
    if params[:commit] == 'update_options'
      update_options
    elsif params[:commit] == 'update_files'
      update_files
    end    
  end



def update_options
  # method you want to write
end


def update_files
  # method you want to invoke
end

查看:

  <div class="field">
    <%= f.label :Options %><br />
    <%= f.text_field :options %>
    <%= f.submit 'update_options' %>
  </div>
  <div class="field">
    <%= f.label :Files %><br />
    <%= f.text_field :files %>
    <%= f.submit 'update_files' %>
  </div>

希望它有所帮助! :)

答案 2 :(得分:0)

如果您打开Firebug / Chrome检查器并查看在checkbox demo中进行任何选择后会发生什么,您可以看到他们发出GET请求并将所选复选框的值传递给服务器。这正是你可以实现的。

将所选复选框的值传递给服务器,然后根据服务器上的进程进行操作。传递给控制器​​的参数应该显示传递的值。

随着前进的小建议,您可以将提供文件详细信息的代码移动到模型中。这样,虽然你没有与db相关联(不要在这个模型类中继承ActiveRecord),但你仍然遵守MVC原则。

答案 3 :(得分:0)

以下是我理解你的问题:

你有

  • 档案1

    • 图片&lt; - 检查
    • 信息&lt; - 检查
    • 规范化
    • Scatterplots
  • 文件2

    • 图片
    • 信息&lt; - 检查
    • 规范化&lt; - 检查
    • Scatterplots

首先创建像

一样的数组
@file_options = [["Pictures", "pics"], ["Info", "info"],["Normalization", "norm"],["Scatterplots", "scat"] ]

在您看来,您可以执行以下操作:

<div class="my_profile_info">     
  <p><td> <%= check_box_tag "files[]", file.id %></td> <%= file.name %></p>
  <td> <%=select_tag "file_options[#{file.id}][]", options_for_select(@file_options), :multiple => true %></td>        
</div>

在你的控制器中:

params[:files].each do |file_id|
  params[:file_options][:file_id].each do |option|
    # do something according to "pics" or "info" etc..
  end
end

注意:要选择多个选项,您可能需要在某些浏览器/操作系统中使用“ctrl”。

答案 4 :(得分:0)

我以前必须做这样的事情。基本上我们所做的是使用javascript来改变隐藏标签的值。

基本上,您为提交按钮设置了ID,并且您输入了onClick事件。我们通常使用JQuery,我认为你也是因为rails大多数时候都是打包它。但基本上在你的document.ready()中,当他们点击删除按钮时,我将隐藏标签的值设置为“删除”,当他们点击分析按钮时,我将隐藏标签的值设置为“analyze”。然后在你的控制器中,只需检查隐藏标签名称的hte参数值。解释比编码更容易...但事实证明我现在正在编辑该文件,所以你可以看看:

    <script>
      jQuery(document).ready(function()
      {
        $('#unassign_button').click(function()
        {
          $('#action').val("unassign");
          $('#action_form').submit();
        });
        $('#add_button').click(function()
        {
          $('#action').val("add");
          $('#action_form').submit();
        });
      });
    </script>

这是我正在使用的javascript代码段。我有一个带有id动作的隐藏标签和一个带有id unassign_button的两个按钮,另一个带有add_button。 action_form是我的表单的id,以便我可以提交它。

有两个提交按钮的问题是它们没有值来发送参数,并且它们都将相同的表单提交到同一个URL,因此您需要某种输入标记来携带单击哪个按钮的值。

我通常只是用HTML而不是ruby标签来编写按钮,因为我通常也只是在那时从javascript提交表单 - 按钮在那时只是装饰性的,HTMl的人更容易没有红宝石的样式,所以我的按钮和隐藏标签看起来像:

<%= hidden_tag :action, "", :id=>"action" %>
<button class="add_button" id="add_button">Add</button>
<button class="unassign_button" id="unassign_button">Unassign</button>

在控制器中我只看params [:action]看看他们点击了哪个按钮。

编辑:

我刚刚发现了这个:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"3lIUwiKQG8hoYXIkPS9RU4GANGR0yGpJkAAyg2WTD0U=", "short_code"=>"tsCe0yFiWL", "commit"=>"Launch", "remote"=>"true"}

这意味着您可以查看提交参数以查看他们点击了哪个按钮...