如何在rails中为has_one关系创建select_box?

时间:2014-08-25 17:17:16

标签: ruby-on-rails ruby simple-form

我有以下型号:

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'

我做错了什么?

2 个答案:

答案 0 :(得分:1)

可能不是导致问题的SimpleForm,而是你设置关联的方式。

您指定了has_one :throughhas_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

这是reference to the platform_ids method