Rails - 将参数从一个视图传递到另一个控制器

时间:2013-09-10 01:55:14

标签: ruby-on-rails validation

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

在我的应用程序中,我有项目和验证。在查看特定项目时,我需要能够获得“验证项目”的链接,该链接会将用户发送到新的验证表单。它们将输入各种值,但我不希望它们必须手动选择此验证所属的项目 - 我希望能够直接将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个不可处理的实体   时间18ms

     

ActiveRecord :: 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 %>

2 个答案:

答案 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