【问题标题】:Rails hidden params not passing correctlyRails 隐藏参数未正确传递
【发布时间】:2015-11-15 19:31:28
【问题描述】:

我正在尝试传递两个隐藏字段和一个答案来创建一个新的答案对象。尽管我可以看到哈希中的所有参数,但似乎隐藏的参数没有正确包含在答案中。我确定这只是我做错的一件简单的事情,但无法弄清楚它在哪里。欣赏时间!

参数哈希:

参数:

{"utf8"=>"✓",
 "authenticity_token"=>"VaZC2MCN0rWJnVPIqSTbPF9HvFNBfm5b5nA3H8YenuVte9SMi9Iy+G4fxz9bWhkDNwGVz9jMBVTxT/SuXFCh+A==",
 "user_id"=>"2",
 "question_id"=>"1",
 "answer"=>{"answer"=>"a"},
 "commit"=>"Create Answer"}

错误: SQLite3::ConstraintException: NOT NULL 约束失败:answers.user_id: INSERT INTO "answers" ("created_at", "updated_at") VALUES (?, ?)

_mc_answer.html.erb(部分我用作选择题的表格。)

这应该将 question_id 和 user_id 连同用户的答案一起传递到 static_pages 控制器并创建一个新的 Answer 对象。

<h4>MC Answer:</h4>
  <p>User ID: <%= @user.id %></p>
  <p>Question ID: <%= question_id %></p>
  <%= form_for(@new_answer, url: static_pages_path(@new_answer)) do |a| %>
    <%= hidden_field_tag :user_id, @user.id %>
    <%= hidden_field_tag :question_id, question_id %>
    <%= a.text_field :answer %>
    <%= a.submit %>
  <% end %>

static_pages_controller.rb

class StaticPagesController < ApplicationController

  def index
    @user = current_user

    if user_signed_in?  
      if @user.manager_id != nil
        @manager = @user.manager_id
      end
      @my_team = User.where("manager_id = ? AND id != ?", @manager, @user.id)
      @questions = Question.active_question.where.not(id: @user.answers)     
    end
    @new_answer = Answer.new
  end

  def new
    @new_answer = Answer.new
  end

  def create
    @user = current user ## Tried adding this to the create method per suggestion below but still getting the same issue. 
    @new_answer = Answer.new(answer_params)
    if @new_answer.save!
      flash.now[success]
    else
    end  
  end

  private


  ## Edited params from .permit(:answer => [:user_id, :question_id, :answer]) but still getting similar error.
  def answer_params
    params.require(:answer).permit(:user_id, :question_id, :answer)
  end
end

answer.rb 模型

class Answer < ActiveRecord::Base


  belongs_to :question
  belongs_to :user

  scope :user_answered, lambda {|q| where("question_id == (?)", q) }


  def next
    Answer.where("id > ?", id).limit(1).first
  end

  def prev
    Answer.where("id < ?", id).limit(1).first
  end  
end



DB Schema for answer model if that's of any use: 

ActiveRecord::Schema.define(version: 20151112025039) do

  create_table "answers", force: :cascade do |t|
    t.integer  "user_id",       null: false
    t.integer  "question_id",   null: false
    t.integer  "points_earned"
    t.text     "comment"
    t.text     "answer",        null: false
    t.datetime "created_at",    null: false
    t.datetime "updated_at",    null: false
  end


  add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true
  add_index "users", ["email"], name: "index_users_on_email", unique: true
  add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
  add_index "users", ["unlock_token"], name: "index_users_on_unlock_token", unique: true

end

【问题讨论】:

  • 在有问题的请求期间服务器日志的完整输出可能会有所帮助。

标签: ruby-on-rails forms ruby-on-rails-4 parameters


【解决方案1】:

您的隐藏字段参数没有进入正确位置的参数哈希,因为您使用了 hidden_field_tag 并且没有指定它们将包含在哈希中的 answer 键下。试试这个:

<%= hidden_field_tag "answer[user_id]", @user.id %>

【讨论】:

  • 谢谢。我尝试通过将 (@user = current_user) 添加到创建操作来进行更改,但仍然遇到相同的错误。
  • answers.user_id 错误的“非空约束失败”?
  • 正确:SQLite3::ConstraintException:NOT NULL 约束失败:answers.user_id: INSERT INTO "answers" ("answer", "created_at", "updated_at") VALUES (?, ?, ?) .
  • 那么值在哪里丢失了?您认为@user.id 可以吗?它是否显示在服务器日志的参数哈希中?
  • 是的。在视图中,我显示了用户 ID 和问题 ID,因此我可以确保两者在部分中都可用。我在顶部包含了参数。它显示 user_id = 2 并且 question_id 是 1。看起来很奇怪的是 answer=>{"answer" = "b"}。似乎答案应该只是“b”,或者答案哈希也应该包括 user_id 和 question_id ......不过我可能是错的。对 Rails 还是有点陌生​​,所以很难知道有什么不寻常的地方。
【解决方案2】:

您应该将每个符号传递给控制器​​,而不是一个哈希数组。

  def answer_params
    params.require(:answer).permit(:answer, :user_id, :question_id)
  end 

不是

 def answer_params
    params.require(:answer).permit(:answer => [:user_id, :question_id, :answer])
  end

因为您的 "user_id"=&gt;"2","question_id"=&gt;"1" 不像写成 "answer"=&gt;{"answer"=&gt;"a", "question_id"=&gt;"1","user_id"=&gt;"2" }, 那样在子哈希中

【讨论】:

  • 谢谢。当我进行更改时,我得到以下信息: SQLite3::ConstraintException: NOT NULL constraint failed: answers.user_id: INSERT INTO "answers" ("answer", "created_at", "updated_at") VALUES (?, ?, ? )
  • 使用以下:参数:{"utf8"=>"✓", "authenticity_token"=>"dYiNFA4DJjpvgZptuPi9Ka3YPx6t2ByHSMhrrrC49SETWySSB+Hf3rjMcIBoZiWHSxuJ+9zOZubWbV1VUcx70A=="3", "user_id"=> "=>"1", "answer"=>{"answer"=>"a"}, "commit"=>"创建答案"}
  • :( 。我编辑我的答案 我从permit params 中删除了一个额外的变量answer 因为你还没有对你的模型进行验证。让我们试试最后一件事&lt;%#= a.text_field :answer %&gt; 评论看看它是否会保存新记录的答案。您在模型中也有一个模型调用answer 和一个变量调用answer
  • 我对 answer_parmas 进行了更改,但仍然出现上述错误。我很困惑为什么它看起来像 created_at 和 updated_at 值没有被创建。当我注释掉答案 text_field 时,我得到一个“参数丢失或值为空:答案”感谢您对此的帮助。
  • 您没有在 create 操作中定义 @user。
猜你喜欢
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2013-06-04
  • 1970-01-01
相关资源
最近更新 更多