【问题标题】:passing values of a radio button from erb to post method in sinatra将单选按钮的值从 erb 传递到 sinatra 中的 post 方法
【发布时间】:2013-10-22 18:28:16
【问题描述】:

我刚开始使用 Web 编程,并为此选择了 Sinatra。我坚持将单选按钮的值从 erb 传递给 post 方法。但是,我可以对文本输入字段执行相同的操作,但无法对单选按钮实现相同的操作。

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

这是我的 sn-ps。

程序.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

停止.erb

<form action="/stop" method="post">
<% @output.each do |button| %>
<ul>
<li><input type="radio" name="tostop" value="<%= button %>"><%= button %></li>
</ul>
<% end %>
<input type="submit" name="stop" value="Stop!">
</form>

[更新]

我可以通过某种方式传递单选按钮的值,并可以通过执行以下操作来查看该值。

程序.rb

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

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

【问题讨论】:

    标签: ruby forms radio-button sinatra erb


    【解决方案1】:

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

    您也可以考虑对输入进行一些清理,因为您正在传递一个有人可以直接伪造给您的操作系统的值...也许确保params[:tostop]lxc-ls --active 的输出列表中。

    【讨论】:

    • 哦,是的。错字在问题中,但不在实际程序中。但是当我用 %x 替换 IO.popen 时,整个事情就开始工作了。我必须完全删除实例变量的引号。但我仍然很困惑为什么这个 dint 与 IO.popen 一起工作。您还可以详细说明“清理输入”吗?整个想法是制作一个小型 Web 界面,我的每个同事都可以在其中创建、启动和停止他们自己的 5 个容器。我怎样才能使这个配额起作用?我是一名系统工程师,对网络世界非常陌生。谢谢你的回答。
    • 啊,好的。好吧,我想我会问你为什么使用 IO.popen 如果你没有使用它返回的 IO 对象并且你没有使用一个块(这通常是为什么人们会使用 IO.popen 来运行系统命令) .您可以尝试一种更简单的方法,例如system("lxc-stop -n '#{params[:tostop]}'")。或者,如果您需要捕获输出,可以将命令包装在反引号中。
    • 另外,就清理输入而言,有很多选项,但正如我在答案中提到的,我认为最简单的方法是检查 ``lxc-ls --active@987654327 @ 确保传递的参数有效。
    • 感谢您的回答。顺便说一句,您能否就限制用户使用 5 个容器以及限制他对他创建的 5 个容器的操作给出一些指导?
    • 不得不承认,我认为这是一个新问题,因为这是一个相当广泛的“旁白”。您说的是引入某种形式的持久性、身份验证,可能还有授权……这在评论中描述起来并不简单。
    猜你喜欢
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 2016-04-25
    • 1970-01-01
    相关资源
    最近更新 更多