【问题标题】:Textarea Not Sending Value through FormTextarea 不通过表单发送值
【发布时间】:2013-12-24 12:18:33
【问题描述】:

所以我的视图中有一个表格..

  form_for(ActivityComment.new, remote: true, url: "/activity_comments/create", class: "col-md-6") do |f|
    f.hidden_field :klass_name, value: activity.klass
    f.hidden_field :klass_id, value: activity.id
    f.text_area :comment, class: "form-control"
    f.submit "Submit", class: "btn btn-success"
  end

html 被打印为...

<form accept-charset="UTF-8" action="/activity_comments/create" class="new_activity_comment" data-remote="true" id="new_activity_comment" method="post">
  <div style="margin:0;padding:0;display:inline">
    <input name="utf8" type="hidden" value="✓">
  </div>
  <input id="activity_comment_klass_name" name="activity_comment[klass_name]" type="hidden" value="Friend">
  <input id="activity_comment_klass_id" name="activity_comment[klass_id]" type="hidden" value="3">
  <textarea class="form-control" id="activity_comment_comment" name="activity_comment[comment]"></textarea>
  <input class="btn btn-success" name="commit" type="submit" value="Submit">
</form>

但是我在控制器中收到的参数是...

Parameters: {"utf8"=>"✓", "activity_comment"=>{"klass_name"=>"Friend", "klass_id"=>"3", "comment"=>""}, "commit"=>"Submit"}

活动评论模型

# == Schema Information
#
# Table name: activity_comments
#
#  id         :integer          not null, primary key
#  user_id    :integer
#  klass_name :string(255)
#  klass_id   :integer
#  comment    :text
#  created_at :datetime
#  updated_at :datetime

class ActivityComment < ActiveRecord::Base
  belongs_to :user
end

comment 属性无论如何都返回空。我相信它与 textarea 有关,因为使用普通输入字段使其工作。出了什么问题,我该如何解决?

【问题讨论】:

  • 当您在 HTTP 请求到达控制器之前检查它时,它是如何发送的?
  • 我相信一个 POST 请求。但我需要仔细检查一下。
  • 在将请求发送到控制器时检查请求是否包含来自 textarea 的表单数据。在 Chrome 中,您可以通过单击 POST 请求并查找表单数据来检查网络选项卡下的开发人员工具。查看原始请求可能会有所帮助。
  • 这是一个 POST 请求。看起来评论仍然没有通过。它是唯一没有值的字段。

标签: html ruby-on-rails ruby ruby-on-rails-4 textarea


【解决方案1】:

很难想出一个解决方案,因为这似乎是一个非常定位的问题。所以这里只是我建议采取的一些步骤来确定它,而不是速记解决方案:

  1. 当您在包含表单的实际页面上时,在浏览器控制台中检查$('#new_activity_comment').serializeArray() 的输出。

    这就是处理jquery-railsdata-remote="true" 表单的js 所做的,以便在将表单数据发送到服务器之前对其进行序列化。

    生成的 Javascript Array 应该有一个名为 "activity_comment[comment]" 和值 "Your comment" 的对象。

    如果没有,您的错误来自您的 Javascript 或 HTML 中的某个位置。除非您发布 JS 源代码、HTML Doctype 等,否则很难说在哪里。

    编辑: 1.5。从 textarea 中删除 "form-control" 类,看看它是否能解决您的问题。如果没有,请尝试删除来自 Bootstrap 的所有 JS 并检查您的表单现在是否正常。如果是,则问题出在 Bootstrap。

  2. 发送请求时,请检查开发人员工具中的“网络”选项卡:您的标头中应包含 FormData,并且您应在其中看到 activity_comment[comment] 和您的 textarea 值。如果你不这样做,很可能你正在使用一个损坏的 jQuery 构建或者你的浏览器有问题/你正在使用一个损坏的构建,尽管除非你在一些 Canary 上,否则这不太可能/用于 Chromium 或其他内容的 Alpha Build 通道。

  3. 如果您的 Javascript 和浏览器发送表单正常,但您的 rails 控制器中仍然没有 textarea 值,请将原始机架参数的内容记录到您的 rails 日志中:

    Rails.logger.info '###' #makes it easier to find your params
    Rails.logger.info URI.decode(request.env["rack.request.form_vars"])
    

    现在,如果 Rack 具有正确的表单值,但 rails 没有,则有两种可能性:

    1. 要么在你的应用程序中出现带有强参数的东西,这意味着你必须检查ActivityCommentsController 中的任何params.requireparams.permitancestors 中的任何Controller
    2. Rails Rack/ActionController 接口中的某处存在错误,尽管这也极不可能。在这种情况下,请尝试将 rails 更新到最新的补丁版本,或者尝试在 github 上的 Rails 问题中搜索 ActionController 错误。

【讨论】:

  • 感谢您提供全面的帖子。这是结果。表格数据显示在标题中,我确实看到了activity_comment[comment],但它的值为空白。我删除了引导代码和任何其他 3rd 方库,但错误仍然存​​在。至于 jQuery 版本,我有1.10.2。最后,我在 Mac 上的 Chrome 和 Ubuntu 上的 Chromium 上对此进行了测试。
  • @jason328 好的,$('#new_activity_comment').serializeArray() 的输出是什么——里面有你的 textarea 数据吗?
  • 我确实修好了。 serializeArray 返回了相应的信息。问题是我的 js 在提交之前更改了文本区域。感谢您的深入帮助。
【解决方案2】:

也许尝试将attr_accessable :comment 添加到您的模型中

【讨论】:

    【解决方案3】:

    您确定您了解form_for remote :true 的作用吗?它将您的表单变成一个 ajax 加载器。因此,如果这发生了,那么应该归咎于一些 javascript。在 chrome 中查看您的 javascript 控制台以获取线索。

    【讨论】:

    • 是的,我知道 remote true 的作用。我已经查看了我的 javascript 控制台,它告诉我数据已发送,除了文本区域。正如我在问题中提到的,将文本区域更改为文本字段可以解决问题,但我需要它成为文本区域。
    猜你喜欢
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多