将参数从rails中的select_tag传递到一个script.rb获取此参数

时间:2019-10-11 12:27:55

标签: ruby-on-rails ruby

您好,如何将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变量中对我有帮助吗?

1 个答案:

答案 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"

请记住,您不会处理提供12然后关闭输入的情况。发生这种情况时,下一个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