我有以下型号:
class Platform < ActiveRecord::Base
has_many :stores, through: :store_platform_associations
end
,
class StorePlatformAssociation < ActiveRecord::Base
belongs_to :store
belongs_to :platform
end
和
class Store < ActiveRecord::Base
has_one :platform, through: :store_platform_association
end
我正在开发一个表单,使用simple_form包含Store
。
在此表单中,我尝试包含Store
并让用户从许多显示的平台中选择一个。
要显示可用的平台,我正在使用:
<%= f.input :platform, collection: Platform.all %>
但是,当我提交表单时,我收到此错误消息:
Internal Server Error
expected Hash (got String) for param `platform'
我做错了什么?
答案 0 :(得分:1)
可能不是导致问题的SimpleForm,而是你设置关联的方式。
您指定了has_one :through
和has_many :through
关联,但没有belongs_to
关联。
我建立这些关联的方式是这样的:
对于Platform
模型:
class Platform < ActiveRecord::Base
has_many :stores
end
对于Store
模型:
class Store < ActiveRecord::Base
belongs_to :platform
end
这允许您使用associations with SimpleForm:
<%= f.association :platform %>
这将呈现带有平台的选择框。您可能希望指定需要用于平台标签的方法:
<%= f.association :platform, label_method: :name %>
答案 1 :(得分:0)
嵌套关联
您遇到的问题是,您尝试使用字符串(通常为object
)设置Platform
id
,这会让您的Rails后端感到困惑! !!!
这是交易:
#app/models/store.rb
Class Store < ActiveRecord::Base
has_one :platform ...
这意味着模型对象的platform
属性实际上由platform
模型中包含的关联数据填充。这也转换为设置的值。
-
<强>修正强>
我认为您要做的是在platform_ids
选择中设置collection
:
#app/views/stores/new.html.erb
...
<%= f.input :platform_ids, collection: Platform.all %>
我认为您不必设置参数,尽管您可能希望这样做以进行测试:
#app/controllers/stores_controller.rb
Class StoresController < ApplicationController
...
private
def store_params
params.require(:store).permit(..., :platform_ids) #-> I don't think you'll need this
end
end