相当简单的问题,我在我的搜索中看到了很多类似的问题,但我读过的解决方案到目前为止都没有。不知道我哪里出错了。
在我的应用程序中,我有项目和验证。在查看特定项目时,我需要能够获得“验证项目”的链接,该链接会将用户发送到新的验证表单。它们将输入各种值,但我不希望它们必须手动选择此验证所属的项目 - 我希望能够直接将project_id与用户在验证表单中输入的值一起传递。
在我的项目视图中,我有:
<%= link_to "Verify Project", new_verification_path(:project_id => @project.id ) %>
然后在验证控制器中:
def new
@verification = Verification.new(params[:verification])
@project = params[:project_id]
end
def create
@verification = Verification.new(params[:verification])
@verification.project = @project
end
但这会产生此错误:
Validation failed: Project does not exist, Project does not exist
如何创建我的验证:从上一页抓取project_id?
修改
从Rails日志中: (单击验证项目)
为127.0.0.1 at开始GET“/ verifications / new?project_id = 4” 2013-09-10 04:02:56 +0200由VerificationsController处理#new as HTML参数:{“project_id”=&gt;“4”}已渲染 verifications / _form.html.erb(91.3ms)已呈现 布局/应用程序中的验证/ new.html.erb(97.5ms)
渲染布局/ _shim.html.erb(0.3ms)帐户加载(0.2ms)SELECT “accounts”。* FROM“accounts”WHERE“accounts”。“remember_token”= 'NuxEYIjeCYyFklN7EyHTDQ'LIMIT 1渲染布局/ _header.html.erb (38.6ms)渲染的布局/ _footer.html.erb(0.3ms)完成200 OK 在381ms(意见:368.4ms | ActiveRecord:2.7ms)
然后创建
在2013-09-10 04:03:04开始127.0.0.1的POST“/ verifications” +0200由VerificationsController处理#create as HTML参数:{“utf8”=&gt;“✓”, “authenticity_token”=&gt; “中sqUBXqA6y5oKCW1DFAi3sv8rQzm + tKjOYDdc / lvUS + C =” “verification”=&gt; {“verifier_name”=&gt;“test”,“checked_on(1i)”=&gt;“2013”, “checked_on(2i)”=&gt;“9”,“checked_on(3i)”=&gt;“10”,“notes”=&gt;“test”}, “commit”=&gt;“创建验证”}帐户加载(0.2ms)SELECT “accounts”。* FROM“accounts”WHERE“accounts”。“remember_token”= 'NuxEYIjeCYyFklN7EyHTDQ'限制1(0.0ms)开始交易
(0.1ms)回滚事务已完成422个不可处理的实体 时间18msActiveRecord :: RecordInvalid(验证失败:项目没有 存在,项目不存在):
app / controllers / verifications_controller.rb:55:在'create'
编辑2
以下是“创建”操作的表单:
<%= form_for(@verification) do |f| %>
<% if @verification.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@verification.errors.count, "error") %> prohibited this verification from being saved:</h2>
<ul>
<% @verification.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="row">
<div class="span6 offset3">
<div class="field">
<%= f.label :verifier_name %><br />
<%= f.text_field :verifier_name %>
</div>
<div class="field">
<%= f.label :checked_on %><br />
<%= f.date_select :checked_on %>
</div>
<div class="field">
<%= f.label :notes %><br />
<%= f.text_area :notes %>
</div>
<div class="actions">
<%= f.submit %>
</div></div></div>
<% end %>
答案 0 :(得分:1)
您的new
控制器操作有点不对劲。您要将实际id
分配给@project
实例变量,而不是与Project
对应的id
对象。随后,您将id
视图中的无效new
传递给create
行动。
通过在@project
操作中正确分配new
实例变量来解决问题:
def new
@verification = Verification.new(params[:verification])
@project = Project.find(params[:project_id])
end
然后,您需要在Project
操作中正确查找create
个对象:
def create
@verification = Verification.new(params[:verification])
@verification.project = Project.find(params[:project_id])
@verification.save
end
最后,通过project_id
表单助手标记在表单中添加hidden_field
作为参数:
# in your `create` form
<%= f.hidden_field :project_id, :value => @project.id %>
答案 1 :(得分:0)
您需要确保将项目ID传递回create方法。您可以在zeantsol的答案中查找项目,也可以只传递项目ID。但是您需要确保在“新”视图中创建的表单将项目ID传递回create方法(可能在隐藏字段中)
请参阅此帖子,查看在视图中使用隐藏字段的示例: Rails hidden field undefined method 'merge' error