我进行了搜索和搜索,没有任何结果,所以我需要求你们帮忙。
我有一个简单的新表单,应该从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'
答案 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
我需要通过创建允许给定字段的新方法来改变我处理通过表单传递的参数的方式。现在它的效果就像它应该的那样。
感谢所有提示。