Ruby 将单选按钮的值从erb传递到sinatra中的post方法

Ruby 将单选按钮的值从erb传递到sinatra中的post方法,ruby,forms,radio-button,sinatra,erb,Ruby,Forms,Radio Button,Sinatra,Erb,我刚开始网络编程,并选择了Sinatra。我一直在将单选按钮的值从erb传递给post方法。但是,我可以对文本输入字段执行相同的操作,但无法对单选按钮执行相同的操作 erb中的单选按钮来自使用get方法中的实例变量创建的数组。请帮我弥补我所缺少的 以下是我的片段 program.rb get '/stop' do @output = [] IO.popen("lxc-ls --active").each do |line| @output << line end erb :sto

我刚开始网络编程,并选择了Sinatra。我一直在将单选按钮的值从erb传递给post方法。但是,我可以对文本输入字段执行相同的操作,但无法对单选按钮执行相同的操作

erb中的单选按钮来自使用get方法中的实例变量创建的数组。请帮我弥补我所缺少的

以下是我的片段

program.rb

get '/stop' do
@output = []
IO.popen("lxc-ls --active").each do |line|
  @output << line
end
erb :stop
end

post '/stop' do
@s = params[:tostop]
p @s + "HI"
#IO.popen("lxc-stop -n '#{params[:stop]}'")
end
post '/stop' do
"You Selected #{params[:tostop]}"
 IO.popen("lxc-stop -n '#{params[:stop]}'")
end

但是,同样的消息没有传递给IO.popen(“lxc-stop-n'{params[:stop]}')。

我不确定,但看起来可能只是一个输入错误。我认为您正在将
params[:stop]
传递给
lxc stop-n
命令,而您可能指的是
params[:tostop]


你也可以考虑对输入进行消毒,因为你正在传递一个可以直接伪造到你的操作系统上的值。也许可以确保

参数[:tostop]
lxc ls--active

输出的列表中。打字错误在问题中,但不在实际程序中。但是有消息说,当我用%x替换IO.popen时,整个程序就开始工作了。我必须完全删除实例变量的引号。但我仍然不明白为什么这个力和IO.popen一起起作用。另外,你能详细说明一下“对输入进行消毒”吗?。整个想法是制作一个小型web界面,我的每个同事都可以在其中创建、启动和停止自己的5个容器。我怎样才能使这个配额有效?我是一名系统工程师,对网络世界非常陌生。谢谢你的回答。啊,好的。我想我会问,如果你没有使用它返回的IO对象,并且你没有使用块(这通常就是为什么要使用IO.popen来运行系统命令),那么为什么要使用IO.popen。您可以尝试一种更简单的方法,比如
系统(“lxc-stop-n'{params[:tostop]}')
。或者,如果需要捕获输出,可以将命令包装为反勾号。此外,就清理输入而言,有许多选项,但正如我在回答中提到的,我认为最简单的方法是检查``lxc ls--active
.split(“\n”)。是否包括?params[:tostop]
确保传递的参数有效。感谢您的回答。顺便说一句,你能给出一些关于限制用户使用5个容器以及限制用户在他创建的5个容器上的操作的指导吗?必须承认,我认为这是一个新问题,因为这是一个相当广泛的“旁白”。您正在谈论引入某种形式的持久性、身份验证,可能还有授权。。。这不是简单的评论。
post '/stop' do
"You Selected #{params[:tostop]}"
 IO.popen("lxc-stop -n '#{params[:stop]}'")
end