【问题标题】:form_for doesn't submit fields to databaseform_for 不向数据库提交字段
【发布时间】:2013-12-10 23:25:22
【问题描述】:

我找了又找,没有找到,所以我需要向你们寻求帮助。

我有一个简单的新表单,它应该从 form_for 中获取两个字段,然后将其发布到数据库中。问题是它没有。

我的示例数据库只有两个字段:name 和 site_id

这是我的 new.html.erb:

<%= form_for @kejsu do |f| %>
<%= f.text_field :name %>
<%= f.text_field :site_id %>
<%= f.submit "Create" %>
<% end %>

这是控制器:

def new
    @kejsu = Kejs.new
end

def create
    @kejsu = Kejs.new(params[:kejsu])
    if @kejsu.save
        redirect_to kejs_index_path
    else
        render "new"
    end
end

点击提交按钮后,仅插入时间戳。这是 rails 服务器 的 sn-p:

Started POST "/cases" for 192.168.56.1 at 2013-12-10 23:11:03 +0000
Processing by KejsyController#create as HTML
  Parameters: {"utf8"=>"â",         "authenticity_token"=>"Sr2ssiwtRtk9pRT5VfuDFglsEmGnjzwVkRGGBSb2zhA=", "kejs"=>    {"name"=>"aa", "site_id"=>"3"}, "commit"=>"Create"}
   (0.1ms)  begin transaction
  SQL (5.1ms)  INSERT INTO "kejs" ("created_at", "updated_at") VALUES (?, ?)       [["created_at", Tue, 10 Dec 2013 23:11:03 UTC +00:00], ["updated_at", Tue, 10 Dec 2013     23:11:03 UTC +00:00]]
   (4.0ms)  commit transaction
Redirected to http://192.168.56.101:3000/cases
Completed 302 Found in 14ms (ActiveRecord: 9.2ms)

如您所见,这些字段作为参数传递,但 INSERT 根本不插入它们。

我已经尝试使用默认的restful路由,编写自己的路由,但无论哪种方式都不起作用。

作为奖励,我的路线:

  get 'cases' => 'kejsy#index', as: :kejs_index
  get 'cases/new' => 'kejsy#new', as: :new_kejs
  post 'cases' => 'kejsy#create'

【问题讨论】:

  • 包含模型也会很有帮助。从日志看来,您的操作正在正确接收参数,问题出在 Kejsu.new(params[:kejsu])
  • 我的模型很空,只是通过 rails g 创建的标准声明。

标签: ruby-on-rails forms form-for strong-parameters


【解决方案1】:

您的params[:kejsu] 引用使用:kejsu,但您的参数存在于params[:kejs] 下,因此您选择nil 作为值。

params 中的键由传递给form_for 的对象的类名 确定(即在本例中为Kejs),而不是由变量名(即@kejsu )。如果您考虑一下,这是有道理的,因为变量名对于form_for 甚至可用,因为@kejsu 是传递的内容。

【讨论】:

  • 这不是我要寻找的直接答案,但您为我指明了要寻找的方向。在做了这个小改动之后,Rails 用ForbiddenAttributesError 错误对我大喊大叫,所以我做了一些搜索,结果是“强参数”。我不知道 Rails 4(我正在使用)改变了处理参数的行为。但切入正题:我在params 上使用了requirepermit,它就像一个魅力。我会把它作为答案发布。
  • :-) 我本来想说一些关于强参数的,但你说你没有得到任何错误,所以我开始寻找其他地方。
  • 我对 Rails 很陌生,我仍然不太明白为什么我应该使用 :kejs 而不是 :kejsu。阅读教程我认为params[:kejsu] 是我在&lt;%= form_for @kejsu do |f| %&gt; 中引用的对象,但我想我错了。
  • 我会跟进这个关于 params[:kejsu] 的问题,因为它与原始问题相关联,但我建议您将任何与强参数有关的问题或答案视为 分开问题/答案,如果可以的话。有关更多信息,请参阅meta.stackexchange.com/a/130630/216381
  • 我明白了,现在说得通了。非常感谢。
【解决方案2】:

要调试,您可以在控制器中使用render :text =&gt; params.inspect,所以我将像这样更改我的代码

def create
  render :text => params.inspect
end

现在去提交您的表格。您的参数中的密钥名称是什么?是kejsu 还是kejs

如果是kejs,则可以将代码更改为

def create
  @kejsu = Kejs.new(params[:kejs])

  if @kejsu.save
    redirect_to kejs_index_path
  else
    render "new"
  end
end

【讨论】:

    【解决方案3】:

    正如所承诺的,带有强参数的答案:

    def create
        @kejsu = Kejs.new(kejs_params)
    
        if @kejsu.save
            redirect_to kejs_index_path
        else
            render "new"
        end
    end
    
    def kejs_params
        params.require(:kejs).permit(:name, :site_id)
    end
    

    我需要通过创建允许给定字段的新方法来更改处理通过表单传递的参数的方式。现在它可以正常工作了。

    感谢所有提示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 2018-04-20
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多