将视图中的普通旧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)
答案 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和会话中的参数。