您好,如何将Web参数传递到Rails中的rb脚本?
我正在使用select_tag,在选择选项时,我会将值发送到script.rb中的变量
可以帮助我学习红宝石吗?对于我来说,rails非常复杂。
我的控制器。rb
@myvalue = ["OPT VALUE 1","OPT VALUE 2"]
我的外部脚本。rb
loop do
@give_my_param_from_rails = gets.chomp
case @give_my_param_from_rails
when '1'
puts "i get number 1"
when '2'
puts "i get number 2"
else
puts "dont get any value"
break
end
end
我的html.erb
<%= select_tag "my_options", options_for_select(@myvalue) %>
在我的外部脚本中,我想在select_tag中选择的rails值设置在@give_my_param_from_rails变量中对我有帮助吗?
答案 0 :(得分:0)
我在脚本的末尾添加了$stdout.flush
,以刷新输入的每一行的输出:
loop do
line = gets.chomp
case line
when '1'
puts "i get number 1"
when '2'
puts "i get number 2"
else
puts "dont get any value"
break
end
$stdout.flush # flush output after each line of input
end
要访问控制器中的脚本,您现在可以执行以下操作:
# allow writing to io by using r+ mode
# https://ruby-doc.org/core-2.6.5/IO.html#method-c-new-label-IO+Open+Mode
File.popen('ruby /path/to/script.rb', 'r+') do |io|
io.puts params[:my_options] # assuming params[:my_options] is "1"
io.gets #=> "i get number 1\n"
io.puts 2
io.gets #=> "i get number 2\n"
io.puts "foo bar" # falling in the else scenario breaks the loop, exiting the script
io.gets #=> "dont get any value\n"
io.puts 1
io.gets #=> nil
io.puts "foo bar"
io.gets #=> nil
end
如果您只需要提供一个输入,则可以改用backticks:
input = params[:my_options] # assuming params[:my_options] is "foo bar"
# escape special characters in double quoted context
# https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html
sanatized_input = input.gsub(/([$`\\"])/, '\\\\\1')
output = `echo "${sanatized_input}" | ruby /path/to/script.rb`
#=> "dont get any value\n"
请记住,您不会处理提供1
或2
然后关闭输入的情况。发生这种情况时,下一个gets
调用将返回nil
。
`echo 1 | ruby /path/to/script.rb`
# script.rb:2:in `block in <main>': undefined method `chomp' for nil:NilClass (NoMethodError)
# from script.rb:1:in `loop'
# from script.rb:1:in `<main>'
#=> "i get number 1\n"
要解决此问题,您可以执行以下操作:
loop do
line = gets or break # break the loop if gets returns nil
line.chomp!
# ...
end