Ruby on rails 将单个项目添加到rails有很多:到

Ruby on rails 将单个项目添加到rails有很多:到,ruby-on-rails,ruby,has-many-through,Ruby On Rails,Ruby,Has Many Through,在客户和他们所拥有的软件产品之间,我有着非常密切的关系 #company.rb 类公司:公司\u来源 结束 #source.rb 类源:company\u来源 结束 #company_source.rb 类CompanySource

在客户和他们所拥有的软件产品之间,我有着非常密切的关系

#company.rb
类公司:公司\u来源
结束
#source.rb
类源:company\u来源
结束
#company_source.rb
类CompanySource
控制器是默认的
rails g scaffold
文件

我需要在“公司编辑”页面上提供一个选择表单,允许向“公司来源”表中添加单个来源

我能得到的最接近的方法是使用选择表单帮助器,但是当我添加新项目时,这将覆盖以前添加的内容

我已经玩了好几个小时了,但我似乎无法正确使用表单/路线/控制器

这是我在写作时使用的表单

<table>
  <% @company.sources.each do |source| %>
    <tr><%= source.name %></tr>
  <% end %>
  <tr>
      <%= form_for @company do |f| %>
        <td>
          <%= select("source", "id", Source.all.collect {|p| [ p.name, p.id ]}, { include_blank: true })%>
        </td>
        <td>
          <%= f.submit "Add Source" %>
        </td>
      <% end %>
  </tr>
</table>

完全控制器(同样,在编写本文时)

class CompaniesController@company.source在
更新
操作中,我建议不要执行
@company.update
,而是执行以下操作:

company_source = CompanySource.create!(company: @company, source: Source.find(source_id)
(警告:代码中可能有错误,您应该能够相当容易地更正)

因此,
update
操作如下所示:

def update
  respond_to do |format|
    company_source = CompanySource.new(company: @company, source_id: params[:source_id])

    if company_source.save
      format.html { redirect_to @company, notice: 'Company was successfully updated.' }
      format.json { render :show, status: :ok, location: @company }
    else
      format.html { render :edit }
      format.json { render json: company_source.errors, status: :unprocessable_entity }
    end
  end
end
尽管这会将视角转移到
CompanySource
,尽管它位于
companyescontroller
内部,但您真正想要做的是创建一个新的
CompanySource
。我认为这是最直截了当的看法


这将确保
公司
-
关系的正确更新。

更新
操作中,我建议不要执行
@company.update
,而是执行以下操作:

company_source = CompanySource.create!(company: @company, source: Source.find(source_id)
(警告:代码中可能有错误,您应该能够相当容易地更正)

因此,
update
操作如下所示:

def update
  respond_to do |format|
    company_source = CompanySource.new(company: @company, source_id: params[:source_id])

    if company_source.save
      format.html { redirect_to @company, notice: 'Company was successfully updated.' }
      format.json { render :show, status: :ok, location: @company }
    else
      format.html { render :edit }
      format.json { render json: company_source.errors, status: :unprocessable_entity }
    end
  end
end
尽管这会将视角转移到
CompanySource
,尽管它位于
companyescontroller
内部,但您真正想要做的是创建一个新的
CompanySource
。我认为这是最直截了当的看法


这将确保
Compnay
-
源代码关系的正确更新。

我知道我可以使用
你可以发布你的表单代码吗?@inye我已经在上面发布了它,但是我已经尝试了我能在网上找到的每一个示例,所以这只是最新的。你使用吗?您还可以使用呈现的html是什么?可能您没有正确地将ID/名称分配给select标记,因此参数的检查没有返回true。试试
f.select(:source\u id,options\u for\u select(source.all.collect{p.name,p.id}),{include\u blank:true})
我知道我可以使用
你能发布表单代码吗?@inye我已经在上面发布了它,但是我已经尝试了我能在网上找到的每一个示例,所以这只是最近的一个。你使用了吗?您还可以使用呈现的html是什么?可能您没有正确地将ID/名称分配给select标记,因此参数的检查没有返回true。尝试
f.select(:source_id,options_for_select(source.all.collect{{p.name,p.id]}),{include_blank:true})