我正在使用Rails 4.2.3。 我有以下型号
class MyObject < ActiveRecord::Base
belongs_to :user
has_many :my_object_times
end
和
class MyObjectTime < ActiveRecord::Base
belongs_to :my_object
end
在我的 PostGres 数据库中,MyObjectTime
对象有一个time_in_ms
字段。 那么,如何构造一个同时具有来自MyObject
对象和MyObjectTime
对象的属性的表单呢? 具体来说,我想捕获time_in_ms
字段。
我试过这个:
<%= form_for @my_object do |f| %>
<% if @my_object.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@my_object.errors.count, "error") %> prohibited this hack from being saved:</h2>
<ul>
<% @my_object.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :day %><br>
<%= f.text_field :day, class: 'datepicker' %>
</div>
<div class="field">
<%= f.label "Time" %>
<%= select_tag('my_object[hour]', options_for_select((0..12).to_a), {:prompt => 'Select Hour'} ) %> hrs
<%= select_tag('my_object[minute]', options_for_select((0..60).to_a), {:prompt => 'Select Minutes'} ) %> min
<%= select_tag('my_object[second]', options_for_select((0..60).to_a), {:prompt => 'Select Minutes'} ) %> sec
<%#= f.number_field :time_in_ms %>
</div>
<div class="actions">
<%= button_to "Save", { :action => "create" }, :method => :post, :class => 'button' %>
</div>
<% end %>
但是我在提交表单时,在尝试从参数构建模型时,我的控制器中出现错误:
def create
@my_object = MyObject.new(my_object_params)
....
end
...
private
def my_object_params
# Main Code goes here
params[:my_object][:time_in_ms] = (params[:my_object][:hour].to_i * 60 * 60 + params[:my_object][:minute].to_i * 60 + params[:my_object][:second].to_i) * 1000
params.require(:my_object).permit(:time_in_ms, :name)
end
如果你要在多个情况下同时使用这些对象,我会在你的MyObject模型中添加一个虚拟属性(attr_accessor :time_in_ms
),以便它可以与标准字段一起处理。这也将摆脱"未知属性"错误。然后在 MyObject 模型中,您可以添加逻辑,将参数从控制器分配给它并根据需要对其进行处理。 如果这是您希望能够同时使用两者的唯一实例,并且在您的 rails 应用程序中的其他任何地方都没有这种情况,您应该按照 Boltzor 的建议进行操作,并在相应的控制器/操作中处理它。
fields_for
,因为您的两个模型都是关联的:
<%= f.fields_for :my_object_time do |mot| %>
<%= mot.number_field :time_in_ms %>
<% end %>
然后在您的MyObject
模型中添加accepts_nested_attributes_for
:
class MyObject < ActiveRecord::Base
belongs_to :user
has_many :my_object_times
attr_accessible :hour, :minute, :second
accepts_nested_attributes_for :my_object_times
end
修改您的MyObjects
控制器,my_object_params
中的白名单my_object_time
:
def my_object_params
params[:my_object][:my_object_times_attributes][:time_in_ms] = (params[:my_object][:hour].to_i * 60 * 60 + params[:my_object][:minute].to_i * 60 + params[:my_object][:second].to_i) * 1000
params.require(:my_object).permit(:name, my_object_times_attributes: [:time_in_ms])
end
现在,由于关联,您将能够在保存MyObject
时保存关联的MyObjectTime
。