将PORO从视图传递到控制器

时间:2015-07-14 16:02:18

标签: ruby-on-rails ruby

将视图中的普通旧Ruby对象传递给控制器​​方法的最佳方法是什么?

它不是DB中持久存在的对象。我宁愿不重构事情,只想要一些想法来传递这个对象。

查看

@my_ip = params[:my_ip_instance]

控制器

@my_ip

page.onResourceError = function(resourceError) { page.reason = resourceError.errorString; page.reason_url = resourceError.url; }; 只是一个字符串...想要整个对象

(Rails 4.2)

2 个答案:

答案 0 :(得分:3)

通常最好的方法是通过表格。考虑为您的所有@my_ip属性创建一个包含隐藏字段的表单。

<%= form_tag activate_apis_path do %>
  <%= hidden_field_tag "my_ip_instance[foo]", @my_ip.foo %>
  <%= hidden_field_tag "my_ip_instance[tomato]", @my_ip.tomato %>
  <%= submit_tag "Activate", class: "btn btn-primary btn-xs" %>
<% end %>

(额外信用:您还可以循环@my_ip的属性以生成隐藏字段。)

另一种方法是将@my_ip序列化为JSON,然后在控制器中对其进行反序列化。我认为这更麻烦。

link_to "activate", activate_apis_path(my_ip_instance: @my_ip.to_json)

为了使这个工作适用于更复杂的对象,您需要按照this post中的描述将自己的序列化器/反序列化逻辑编写到类中。

require "json"

class A
  def initialize(string, number)
    @string = string
    @number = number
  end

  def to_json(*a)
    {
      "json_class"   => self.class.name,
      "data"         => {"string" => @string, "number" => @number }
    }.to_json(*a)
  end

  def self.json_create(o)
    new(o["data"]["string"], o["data"]["number"])
  end
end

答案 1 :(得分:0)

您基本上需要做的是序列化对象。 Rails提供内置选项来序列化对象和Object.to_query,可用于转换为查询参数。

但是,绕过一堆违反休息状态的状态,表明应用程序设计不佳。如果它是非持久对象,则应在POST / PATCH请求中作为表单参数传递。在GET请求中,您应该努力初始化标题中所需的所有对象,请求URL和会话中的参数。