2

我需要这样的东西但在 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 中。

编辑

示例
选择选项(复选框)

  • 正常化
  • 图片
  • 散点图
  • 信息

选择文件(复选框):

  • 文件 1
  • 文件2
  • 文件 3
4

5 回答 5

3

我不是 100% 确定我是否了解您的需求,但这是我的理解:

您有一堆文件可以通过复选框进行选择,您还需要选项复选框来将其他选项传递给“分析”操作?

只需在您的 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

etc etc etc params[:nameofcheckboxtag] 如果复选框被选中,将被设置为值(第二个选项,在我的示例中为 true),否则它将不存在。无论哪种方式,此示例只会处理选中的选项。

于 2013-05-20T19:19:48.933 回答
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>

希望能帮助到你!:)

于 2013-05-22T19:59:46.973 回答
0

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

将选定复选框的值传递给服务器,然后根据该处理服务器上的内容。传递给控制器​​的参数应该显示正在传递的值。

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

于 2013-05-14T12:02:38.137 回答
0

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

基本上,您为提交按钮设置了 ID,然后放入了 onClick 事件。我们通常使用 JQuery,我想你也是,因为 Rails 大部分时间都将它打包。但基本上在您的 document.ready() 中,当他们单击删除按钮时,我将隐藏标记的值设置为“删除”,当他们单击分析按钮时,我将隐藏标记的值设置为“分析”。然后在你的控制器中,当它进来时,只需检查隐藏标签名称的 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"}

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

于 2013-05-22T20:14:38.553 回答
0

我理解你的问题是这样的:

你有

  • 文件 1

    • 图片<--检查
    • 信息 <--检查
    • 正常化
    • 散点图
  • 文件 2

    • 图片
    • 信息 <--检查
    • 规范化<--检查
    • 散点图

首先创建和数组

@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”。

于 2013-05-22T09:11:34.580 回答