我需要一些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。
修改
实施例
选择选项(复选框)
选择文件(复选框):
答案 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
文件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”。
答案 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"}
这意味着您可以查看提交参数以查看他们点击了哪个按钮...