【问题标题】:Pass a PORO from view to controller将 PORO 从视图传递到控制器
【发布时间】:2015-07-14 16:02:18
【问题描述】:

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

它不是在数据库中持久化的对象。我宁愿不重构事物,只想要一些关于传递这个对象的最佳方式的想法。

查看

link_to "activate", activate_apis_path(my_ip_instance: @my_ip), class: "btn btn-primary btn-xs"

控制器

@my_ip = params[:my_ip_instance]

@my_ip 只是一个字符串...想要整个对象

(Rails 4.2)

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    通常最好的方法是通过表格。考虑为所有 @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
    

    【讨论】:

    • 对象非常复杂。无法创建表格来表示它。我看到通过@my_ip 的视图代码。你会在控制器中放入什么来实例化同一个对象?
    • 我建议阅读这篇文章,了解他们如何处理 to_jsonjson_create 场景。 skorks.com/2010/04/…
    • 你是如何初始化对象的?
    • 我会初始化它 - 如果它不是 REST 资源,请不要通过 HTTP 传递它。你只是在打开一堆潜在的安全漏洞。
    • @max 给出了很好的建议,但这真的取决于你的情况。恐怕除非您更新您的问题以包含非常具体的信息,否则很难提供更多帮助。一方面,很难回答假设一个简单对象的问题,然后收到说明它是一个复杂对象的评论。帮助我们帮助您!
    【解决方案2】:

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

    但是,像这样传递一堆状态违反了休息,并且表明应用程序设计不佳。如果它是一个非持久化对象,它应该在 POST/PATCH 请求中作为表单参数传递。在 GET 请求中,您应该努力从请求的 url 和 session 的 headers、params 中初始化所有需要的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      相关资源
      最近更新 更多