将非模型参数传递给控制器​​操作

时间:2016-11-04 13:40:54

标签: ruby-on-rails

如何将那些不属于模型的参数传递给控制器​​?

script.rb

class Script < ActiveRecord::Base
   attr_accessor :directory
   attr_accessor :xmlFile
end

show.html.erb

<h1><%= @script.Name %></h1>

<%= simple_form_for @script, :url => script_execute_path(script_id: @script.id) do |f| %>
  <%= f.input :directory %>
  <%= f.input :xmlFile %>
  <%= f.button :submit, 'Run' %>
<% end %>

此处directoryxmlFile用于获取输入,但它不是Script模型的一部分。现在我需要将目录和xmlFile中包含的值传递给我的execute控制器操作

  def execute 
    @script = Script.find(params[:script_id])
    #something like this -- @xmlFile = params[:xmlFile]
  end

我如何在此处访问它?

3 个答案:

答案 0 :(得分:3)

它们确实是Script模型的一部分,因为它们被定义为模型的属性。他们没有坚持的事实是无关紧要的。

您可以从代表模型本身的参数哈希中访问它们。您可以确定检查请求日志的确切名称,您将看到参数的结构。

假设模型的名称为Script,则应将包含脚本属性的哈希键称为script,因此:

params[:script][:directory]

请注意Ruby不使用camelCase,因此名称xmlFile不符合约定,可能会导致问题。名称应为xml_file,而不是xmlFile

答案 1 :(得分:1)

对于不属于模型的任意字段,您可以使用Rails的独立标记帮助程序,例如text_field_tag

<%= simple_form_for @script, :url => script_execute_path(script_id: @script.id) do |f| %>
  <%= text_field_tag :directory %>
  <%= text_field_tag :xmlFile %>
  <%= f.button :submit, 'Run' %>
<% end %>

如果您想使用现有值预先填充它们,您也可以将其传入:

<%= text_field_tag :directory, 'some default value' %>

答案 2 :(得分:1)

看起来你实际上已经弄明白了。通过声明

attr_accessor :directory
attr_accessor :xmlFile

在您的Script模型中,您已经有效地将它们作为模型的一部分。保存对象时,它们不会持久保存到数据库中。但只要对象在内存中,那些属性就可用。

由于您已经在视图中定义了这些属性:

<%= f.input :directory %>
<%= f.input :xmlFile %>

通过paramsparams[:directory] params[:xmlFile]哈希,您可以在控制器中使用它们。