Ruby on rails 属于/有许多关系
我有以下资料: 客户机有许多报告,报告属于一个客户机 但是,在创建报告时,它没有将客户端id分配到数据库中,但不确定原因是什么 我做错什么了吗 客户机模型Ruby on rails 属于/有许多关系,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我有以下资料: 客户机有许多报告,报告属于一个客户机 但是,在创建报告时,它没有将客户端id分配到数据库中,但不确定原因是什么 我做错什么了吗 客户机模型 class Client < ActiveRecord::Base has_many :reports, :dependent => :destroy end 报表控制器(创建) 客户端编辑视图 <%= form_for([:admin, @client.reports.build]) do |f| %>
class Client < ActiveRecord::Base
has_many :reports, :dependent => :destroy
end
报表控制器(创建)
客户端编辑视图
<%= form_for([:admin, @client.reports.build]) do |f| %>
<label class="formlabel">Report Upload</label>
<%= f.file_field :report, :class=>"text-input small-input" %>
<div class="actions">
<br />
<%= f.submit 'Upload', :class => 'button' %>
</div>
<% end %>
报告上传
“文本输入小输入”%>
'按钮'%>
我们将不胜感激 客户端id在视图的表单中没有相关的输入字段。您可以在表单中添加以下内容:
f.hidden_field :client_id
然后在控制器中,将其设置为:
@report.client_id = params[:report][:client_id]
或者,您可以在url中包含客户id。我很好奇;由于您使用的是表单_for中的
.build
,因此客户端可能已经在url中
如果删除:
@report.client_id = params[:client][:client_id]
那么,接下来会发生什么呢?因为这一行没有正确地查看参数,所以我想知道您是否正在覆盖您为
要么这样,要么像@Adam said这样的隐藏字段就行了。愚蠢的错误似乎需要在表单上设置end函数,以便客户端在打开报表表单之前关闭它 然后添加客户机id的字段,现在根据Adam的建议隐藏该字段 谢谢Steph的建议,因为这有助于我解决这个错误
谢谢大家!:-) 您能否验证是否正在为
参数[:client][:client\u id]
设置值?如果不是,则通过将@client.reports.build设置为nil,您就可以撤消@client.reports.build的工作。AFAIK当使用.build
方法初始化子对象时,当您运行.save
时,它应该会自动为您设置外键。您可以向我们显示创建/更新操作的参数吗?不知道我是否理解您的意思更新操作在上面请快速阅读,每次您向服务器请求执行某项操作(例如,POST、GET)时,params散列变量都会被发送到相应的控制器操作中,并附带信息。在您的情况下,它将发送表单中收集的数据以构建新的报表对象。通过查看控制台中的服务器日志,您可以确切地了解发送的内容。我们感兴趣的是表单中是否为client\u id
设置了一个值。Hi Adam客户端id位于URL中,就像它位于客户端模型的编辑函数中一样/clients/:id/editOK,所以它类似于/clients/:client\u id/reports/new?如果是这样,那么您只需执行@report.client\u id=params[:client\u id]。这不一定是世界上最安全的事情(除非你有一些控件,他们可以通过任何他们想要的客户端id发送),但它应该可以工作。对不起,URL只是clients/1/edit,在这个视图中是报告的上传表单,不需要额外的URL。现在已尝试但未成功我没有收到任何错误,但报告表中的客户端id仍然为空。隐藏的\u字段:客户端id,:value=>params[:id]
为您做些什么?隐藏字段提供相同的无错误记录在数据库中创建,但客户端id为空。如果我将其删除,则报告记录在数据库中创建,但客户端id字段为空(因此不创建到客户端的链接),谢谢运行rake routes
,这条路线是什么?是/clients/:client_id/reports/new
?请让我知道当你耙的时候路由是什么,以及它说它要去哪个控制器,等等。嗨,路由是/clients/:clients\u id/edit,我正试图在clients控制器的编辑操作中做到这一点。不过,我已经从数据库和表单中删除了该列,现在正在寻找一种可行的方法。你有什么建议?很高兴你把它弄明白了!
f.hidden_field :client_id
@report.client_id = params[:report][:client_id]
@report.client_id = params[:client][:client_id]