没有将params发布到Rails控制器

时间:2015-08-31 04:21:43

标签: ruby-on-rails forms post params

我在带有一些嵌套字段的应用中有一个表单。 我正在使用simple_form_for,bootstrap,slim和Rails 4.2以及表格支持对象here

这里的服务器端缺少证明参数(N.B.我已经检查了authenticity_token字段是否在标记中)

这是日志

Started POST "/example_sentences/9/breakdowns" for ::1 at 2015-08-31 12:37:57 +0900
  ActiveRecord::SchemaMigration Load (18.8ms)  SELECT "schema_migrations".* FROM "schema_migrations"
Processing by BreakdownsController#create as HTML
  Parameters: {"example_sentence_id"=>"9"}
Can't verify CSRF token authenticity

关闭CSRF保护以尝试和调试给出:

Started POST "/example_sentences/9/breakdowns" for ::1 at 2015-08-31 13:00:05 +0900
Processing by BreakdownsController#create as HTML
  Parameters: {"example_sentence_id"=>"9"}
  User Load (24.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
Completed 400 Bad Request in 355ms (ActiveRecord: 156.3ms)

ActionController::ParameterMissing - param is missing or the value is empty: breakdown:

显然,有很多因素意味着这偏离了Rails方式,所以任何事情都可能出错。并且显示视图代码会引入更多问题。

因此,我将显示生成的HTML(减去样式信息)并询问是否有人可以看到任何明显错误。我有点希望它会成为一个表面上的时刻,并且会遗漏一些明显的东西。

<form novalidate="novalidate" id="new_breakdown" action="/example_sentences/9/breakdowns" accept-charset="UTF-8" method="post">
  <input name="utf8" type="hidden" value="✓">
  <input type="hidden" name="authenticity_token" value="cOU87EZXRkV1a0QA1ohwlqM5Ny43QvgcRaqKan9mdgs12jR8RnJfyVXp9VIJHkMRkBUvZ16Io7QaGcBazjVqGw==">
  <input type="text" value="これ" name="breakdown[word_mapping][1][text]" id="breakdown_word_mapping_1_text" >
  <input type="text" value="this" name="breakdown[word_mapping][1][translation]" id="breakdown_word_mapping_1_translation">
  <input type="text" value="は" name="breakdown[word_mapping][2][text]" id="breakdown_word_mapping_2_text">
  <input type="text" value="" name="breakdown[word_mapping][2][translation]" id="breakdown_word_mapping_2_translation">
  <input type="submit" name="commit" value="Save translations">
</form>

其他信息

在〜/ .rbenv / versions / 2.2.2 / lib / ruby​​ / gems / 2.2.0 / gems / actionpack-4.2.3 / lib / action_controller / metal / request_forgery_protection.rb

:valid_authenticity_token?检查行277

期间

对于request.body.read,我可以看到真实性令牌     &#34; UTF8 =%E2%9C%93&安培; authenticity_token = RTFWCJZ3QnRgnNWFF66ej2aetx7H5n7BcbLKW4v145YADl6YllJb%2BEAeZNfIOK0IVbKvV64sJWkuAYBrOqb%2Fhg%3D%3D&安培;击穿%5Bword_mapping%5D%5B1%5D%5Btext%5D =%E3%81%93%E3%82%图8C&安培;击穿%5Bword_mapping%5D%5B1%5D%5Btranslation%5D =此&安培;击穿%5Bword_mapping%5D%5B1%5D%5Breading%5D =安培;击穿%5Bword_mapping%5D%5B1%5D%5B_destroy%5D = 0&安培;击穿%​​5Bword_mapping%5D%5B2%5D%5Btext%5D =%E3%81%AF&安培;击穿%5Bword_mapping%5D%5B2%5D%5Btranslation%5D =安培;击穿%5Bword_mapping%5D%5B2%5D%5Breading%5D =&安培;击穿%5Bword_mapping%5D%5B2%5D%5B_destroy%5D = 0&安培;击穿%5Bword_mapping%5D%5B3%5D%5Btext%5D =%E3%83%9A%E3%83%B3&安培;击穿%5Bword_mapping%图5D%5B3%5D%5Btranslation%5D =笔&安培;击穿%5Bword_mapping%5D%5B3%5D%5Breading%5D =安培;击穿%5Bword_mapping%5D%5B3%5D%5B_destroy%5D = 0&安培;击穿%5Bword_mapping%5D% 5B4%5D%5Btext%5D =%E3%81%A7%E3%81%99安培;击穿%5Bword_mapping%5D%5B4%5D%5Btranslation%5D =安培;击穿%5Bword_mapping%5D%5B4%5D %5Breading%5D =安培;击穿%5Bword_mapping%5D%5B4%5D%5B_destroy%5D = 0&安培;击穿%5Bword_mapping%5D%5B%5D%5Btext%5D =%E3%81%93%E3%82%8C&安培;击穿%​​5Bword_mapping%5D%5B%5D%5Btranslation%5D =安培;击穿%5Bword_mapping%5D%5B%5D%5Breading%5D =安培;击穿%5Bword_mapping%5D%5B%5D%5B_destroy%5D = 0&安培;击穿% 5Bword_mapping%5D%5B%5D%5Btext%5D =%E3%81%AF&安培;击穿%5Bword_mapping%5D%5B%5D%5Btranslation%5D =安培;击穿%5Bword_mapping%5D%5B%5D%5Breading%5D =安培;击穿%5Bword_mapping%5D%5B%5D%5B_destroy%5D = 0&安培;击穿%5Bword_mapping%5D%5B%5D%5Btext%5D =%E3%83%9A%E3%83%B3&安培;击穿%5Bword_mapping%5D%图5B%5D%5Btranslation%5D =安培;击穿%5Bword_mapping%5D%5B%5D%5Breading%5D =安培;击穿%5Bword_mapping%5D%5B%5D%5B_destroy%5D = 0&安培;击穿%5Bword_mapping%5D%5B%图5D%5Btext%5D =%E3%81%A7%E3%81%99安培;击穿%5Bword_mapping%5D%5B%5D%5Btranslation%5D =安培;击穿%5Bword_mapping%5D%5B%5D%5Breading%5D =安培;击穿%5Bword_mapping%5D%5B%5D%5B_destroy%5D = 0&安培;提交=保存+ transla蒸发散&#34;

encoded_masked_token的值为nil

事实上,path_parameters是我在请求中获得的参数的唯一部分。

in: "~/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/actionpack-4.2.3/lib/action_dispatch/http/request.rb"

(byebug) pp @env.keys.sort.grep(/action_dispatch/).grep(/param/).map{|k| [k, @env[k]]}

[["action_dispatch.parameter_filter", [:password]],
 ["action_dispatch.request.parameters",
  {"controller"=>"breakdowns",
   "action"=>"create",
   "example_sentence_id"=>"9"}],
 ["action_dispatch.request.path_parameters",
  {:controller=>"breakdowns", :action=>"create", :example_sentence_id=>"9"}],
 ["action_dispatch.request.query_parameters", {}],
 ["action_dispatch.request.request_parameters", {}]]

所以我已经以某种方式失去了参数。

2 个答案:

答案 0 :(得分:2)

从错误消息中,听起来您的代码要求您的参数不正确。

如果你有以下内容:

params.require(breakdown: [fields])

那应该是

params.require(:breakdown).permit(fields)

试一试。

答案 1 :(得分:0)

好的,问题在于名称参数的格式。我没有抓到Rails堆栈中的所有参数,包括authenticity_token / CSRF令牌丢失,但基本上是:

而不是: breakdown[word_mapping][0][translation]

这是正确的: breakdown[word_mappings_attributes][0][translation]

如果其他人遇到类似的问题,可能还需要添加额外的信息。

我正在使用带有表单支持对象的嵌套表单,如在OP中链接的关键博客文章中所述。

根据其他地方的过时建议,我的瘦身代码看起来像这样:

= f.simple_fields_for "word_mapping[]", @breakdown.word_mappings do |w|
  = render "word_mapping_fields", f: w

导致帖子中显示输出HTML。

正确的版本是:

= f.simple_fields_for "word_mappings", @breakdown.word_mappings do |w|
  = render "word_mapping_fields", f: w

在我的表单支持对象上,在这种情况下,我必须将word_mappings_attributes=委托给AR对象ExampleSentence。虽然使用delegate本身不起作用,所以我不得不手动编写代码。

def word_mappings_attributes=(attrs)
  example_sentence.word_mappings_attributes=attrs
end

我还必须在表单中添加以下内容:

class << self
  delegate :reflect_on_association, to: ExampleSentence
end