1

相当简单的问题,我在搜索中看到了很多类似的问题,但到目前为止我读过的解决方案都没有奏效。不知道我哪里错了。

在我的应用程序中,我有项目和验证。查看特定项目时,我需要能够有一个指向“验证项目”的链接,这会将用户发送到一个新的验证表单。他们将输入各种值,但我不希望他们必须手动选择此验证所属的项目——我希望能够将 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 日志中:(单击验证项目)

在 2013 年 9 月 10 日 04:02:56 +0200 由 VerificationsController#new 作为 HTML 参数处理 127.0.0.1 开始 GET "/verifications/new?project_id=4":{"project_id"=>"4"} 渲染验证/_form.html.erb (91.3ms) 在布局/应用程序中渲染验证/new.html.erb (97.5ms)
渲染布局/_shim.html.erb (0.3ms) 帐户加载 (0.2ms) 选择“帐户”。* FROM "accounts" WHERE "accounts"."remember_token" = 'NuxEYIjeCYyFklN7EyHTDQ' LIMIT 1 Rendered layouts/_header.html.erb (38.6ms) Rendered layouts/_footer.html.erb (0.3ms) 在 381ms 内完成 200 OK(查看次数: 368.4 毫秒 | 活动记录:2.7 毫秒)

然后创建

在 2013-09-10 04:03:04 +0200 由 VerificationsController#create 作为 HTML 参数处理 127.0.0.1 开始 POST "/verifications":{"utf8"=>"✓", "authenticity_token"=>"sqUBXqA6y5oKCW1DFAi3sv8rQzm+ tKjOYDdc/lvUS+c=", "verification"=>{"verifier_name"=>"test", "checked_on(1i)"=>"2013", "checked_on(2i)"=>"9", "checked_on( 3i)"=>"10", "notes"=>"test"}, "commit"=>"Create Verification"} 账户负载 (0.2ms) 选择 "accounts".* 从 "accounts" WHERE "accounts"。 "remember_token" = 'NuxEYIjeCYyFklN7EyHTDQ' LIMIT 1 (0.0ms) 开始交易
(0.1ms) 回滚事务在 18ms 内完成 422 Unprocessable Entity

ActiveRecord::RecordInvalid(验证失败:项目不存在,项目不存在):
app/controllers/verifications_controller.rb:55:in `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 %>
4

2 回答 2

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

然后,您需要在操作中正确查找 aProject对象create

def create
    @verification = Verification.new(params[:verification])
    @verification.project = Project.find(params[:project_id])
    @verification.save
end

最后,通过表单助手标签project_id在表单中添加 as 参数:hidden_field

# in your `create` form
<%= f.hidden_field :project_id, :value => @project.id %>
于 2013-09-10T02:08:59.700 回答
0

您需要确保将您的项目 ID 传递回您的 create 方法。您可以按照 zeantsol 的答案查找项目,也可以只传递项目 ID。但是您需要确保您在“新”视图中创建的表单将项目 ID 传递回您的创建方法(可能在隐藏字段中)

请参阅这篇文章以查看在视图中使用隐藏字段的示例: Rails hidden field undefined method 'merge' error

于 2013-09-10T02:11:34.077 回答