Rails 多态关联不会保存 _type
Rails polymorphic association won't save _type
我的项目中有几个模型:Request、Work、Car 和 Employee。 Work 是 Request 和 Car/Employee 之间的中间模型。
以下是协会:
请求
has_many :works, dependent: :destroy
def performers
works.map {|x| x.performer}
end
工作
belongs_to :request
belongs_to :performer, polymorphic: true
汽车
has_many :works, as: :performer
has_many :requests, through: :works, as: :performer
员工
has_many :works, as: :performer
has_many :requests, through: :works, as: :performer
查看用于创作作品:
<%= form_for([@request, @work]) do |f| %>
<%= (f.collection_select :performer_id, Employee.all, :id, :name) if @request.type == "StaffRequest" %>
<%= (f.collection_select :performer_id, Car.all, :id, :select_info) if @request.type == "CarRequest" %>
<%= f.submit 'OK' %>
<% end %>
工作控制器
def new
@work = @request.works.new
end
def create
@work = @request.works.new(work_params)
end
def work_params
params.require(:work).permit(:performer_id, :request_id)
end
问题是我的 performer_type 列总是空的,它没有保存 class 名称。可能是什么问题?有什么想法吗?
因为你没有通过它是空的,你应该为你的表单添加一个隐藏字段:
<%= form_for([@request, @work]) do |f| %>
<% if @request.type == "StaffRequest" %>
<%= (f.hidden_field :performer_type, value: "Employee") %>
<%= (f.collection_select :performer_id, Employee.all, :id, :name) %>
<% elsif @request.type == "CarRequest" %>
<%= (f.hidden_field :performer_type, value: "Car") %>
<%= (f.collection_select :performer_id, Car.all, :id, :select_info) %>
<% end %>
<%= f.submit 'OK' %>
<% end %>
除了 :performer_id,您还必须传递 :performer_type,一种方法是通过 select_tag :
形式
def create
@work = @request.works.new(work_params)
end
def work_params
# use :performer if you use :performer as in the select form field
params.require(:work).permit(:performer, :request_id)
# OR
# use :performer_id & :performer_type if you also use the hidden field
params.require(:work).permit(:performer_id, :performer_type, :request_id)
end
有一个很好的例子(对于 Rails 4.2)使用单个 select 表单字段进行多态,所以你可以这样写:
<%= f.grouped_collection_select :global_performer, [ Car, Employee ], :all, :model_name, :to_global_id, :name %>
How to create grouped select box in Rails for polymorphic association using Global ID?
我的项目中有几个模型:Request、Work、Car 和 Employee。 Work 是 Request 和 Car/Employee 之间的中间模型。
以下是协会:
请求
has_many :works, dependent: :destroy
def performers
works.map {|x| x.performer}
end
工作
belongs_to :request
belongs_to :performer, polymorphic: true
汽车
has_many :works, as: :performer
has_many :requests, through: :works, as: :performer
员工
has_many :works, as: :performer
has_many :requests, through: :works, as: :performer
查看用于创作作品:
<%= form_for([@request, @work]) do |f| %>
<%= (f.collection_select :performer_id, Employee.all, :id, :name) if @request.type == "StaffRequest" %>
<%= (f.collection_select :performer_id, Car.all, :id, :select_info) if @request.type == "CarRequest" %>
<%= f.submit 'OK' %>
<% end %>
工作控制器
def new
@work = @request.works.new
end
def create
@work = @request.works.new(work_params)
end
def work_params
params.require(:work).permit(:performer_id, :request_id)
end
问题是我的 performer_type 列总是空的,它没有保存 class 名称。可能是什么问题?有什么想法吗?
因为你没有通过它是空的,你应该为你的表单添加一个隐藏字段:
<%= form_for([@request, @work]) do |f| %>
<% if @request.type == "StaffRequest" %>
<%= (f.hidden_field :performer_type, value: "Employee") %>
<%= (f.collection_select :performer_id, Employee.all, :id, :name) %>
<% elsif @request.type == "CarRequest" %>
<%= (f.hidden_field :performer_type, value: "Car") %>
<%= (f.collection_select :performer_id, Car.all, :id, :select_info) %>
<% end %>
<%= f.submit 'OK' %>
<% end %>
除了 :performer_id,您还必须传递 :performer_type,一种方法是通过 select_tag :
形式def create
@work = @request.works.new(work_params)
end
def work_params
# use :performer if you use :performer as in the select form field
params.require(:work).permit(:performer, :request_id)
# OR
# use :performer_id & :performer_type if you also use the hidden field
params.require(:work).permit(:performer_id, :performer_type, :request_id)
end
有一个很好的例子(对于 Rails 4.2)使用单个 select 表单字段进行多态,所以你可以这样写:
<%= f.grouped_collection_select :global_performer, [ Car, Employee ], :all, :model_name, :to_global_id, :name %>
How to create grouped select box in Rails for polymorphic association using Global ID?