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})