form_for不向数据库提交字段

时间:2013-12-10 23:25:22

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

我进行了搜索和搜索,没有任何结果,所以我需要求你们帮忙。

我有一个简单的新表单,应该从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服务器

的摘录
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'

3 个答案:

答案 0 :(得分:1)

您的params[:kejsu]引用使用了:kejsu,但您的参数位于params[:kejs]下,因此您需要获取值nil

params中的键由传递给form_for的对象的类名决定(在本例中为Kejs),而不是由变量决定名称(即@kejsu)。如果您考虑一下,这是有道理的,因为变量名称甚至不能可用form_for,因为@kejsu是什么通过了。

答案 1 :(得分:0)

调试你可以在你的控制器中使用render :text => 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

答案 2 :(得分:0)

正如所承诺的那样,具有强大参数的答案:

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

我需要通过创建允许给定字段的新方法来改变我处理通过表单传递的参数的方式。现在它的效果就像它应该的那样。

感谢所有提示。