繁体   English   中英

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

[英]Rails - Passing a parameter from one view to a different controller

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

在我的应用程序中,我有项目和验证。 在查看特定项目时,我需要能够链接到“验证项目”,该链接会将用户发送到新的“验证”表单。 他们将输入各种值,但是我不希望他们必须手动选择此验证所属的项目-我希望能够直接将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-09-10 04:02:56 +0200 VerificationsController#new作为HTML参数开始针对127.0.0.1的GET“ / verifications / new?project_id = 4”的HTML参数:{“ project_id” =>“ 4”}呈现的验证/_form.html.erb(91.3ms)在布局/应用程序中呈现的验证/new.html.erb(97.5ms)
呈现的布局/_shim.html.erb(0.3毫秒)帐户加载(0.2毫秒)选择“账户”。*从“账户”中的“账户”。“ remember_token” ='NuxEYIjeCYyFklN7EyHTDQ'LIMIT 1呈现的布局//header.html.erb (38.6ms)渲染的layouts / _footer.html.erb(0.3ms)在381ms内完成200 OK(查看:368.4ms | ActiveRecord:2.7ms)

然后创建

在2013-09-10 04:03:04 +0200通过VerificationsController#create作为HTML参数开始针对127.0.0.1的POST“ /验证”:{“ utf8” =>“✓”,“ authenticity_token” =>“ sqUBXqA6y5oKCW1DFAi3sv8rQzm + tKjOYDdc / lvUS + c =“,” verification“ => {” verifier_name“ =>” test“,” checked_on(1i)“ =>” 2013“,” checked_on(2i)“ =>” 9“,” checked_on( 3i)“ =>” 10“,”笔记“ =>” test“},”提交“ =>”创建验证“}帐户加载(0.2毫秒)选择“帐户”。*从“帐户”中选择“帐户”。 “ remember_token” ='NuxEYIjeCYyFklN7EyHTDQ'LIMIT 1(0.0ms)开始交易
(0.1毫秒)回滚事务在18毫秒内完成了422个不可处理实体

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

您的new控制器操作有些偏离。 您正在为@project实例变量分配实际的id ,而不是与该id对应的Project对象。 随后,您会将无效的id new视图传递到create动作。

通过在new操作中正确分配@project实例变量来解决问题:

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

然后,您需要在create动作中对Project对象进行适当的查找:

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

最后,通过hidden_field表单帮助标签将project_id添加为表单中的参数:

# in your `create` form
<%= f.hidden_field :project_id, :value => @project.id %>

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

请参阅这篇文章,以查看在视图中使用隐藏字段的示例: Rails隐藏字段未定义方法“合并”错误

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM