【发布时间】:2014-10-06 07:13:57
【问题描述】:
这里是非常新的 Rails 4 开发人员。我有一个用户正在创建练习的表单。练习可以有很多设备,设备可以是可选的(认为俯卧撑代表做俯卧撑)。我将这个“可选”字段存储在连接表 exercise_equipment 中。
我无法通过我选择的集合元素的值实际发送参数。模型、视图、控制器和参数见下文。
以下是我的模型的属性/关系:
# id :integer
# name :string
# is_public :boolean
Exercise
has_many :exercise_equipment
has_many :equipment, :through => :exercise_equipment
accepts_nested_attributes_for :exercise_equipment
# id :integer
# exercise_id :integer
# equipment_id :integer
# optional :boolean
ExerciseEquipment
belongs_to :exercise
belongs_to :equipment
accepts_nested_attributes_for :equipment
# id :integer
# name :string
Equipment
has_many :exercise_equipment
has_many :exercises, :through => :exercise_equipment
这里有一些(可能)相关的控制器方法:
def new
@exercise = Exercise.new
@exercise.exercise_equipment.build
end
def create
@exercise = Exercise.new( exercise_params )
if @exercise.save
redirect_to @exercises
else
render 'new'
end
end
def edit
@exercise = Exercise.find( params[:id] )
end
def update
@exercise = Exercise.find( params[:id] )
if @exercise.update_attributes( exercise_params )
redirect_to @exercises
else
render 'edit'
end
end
def exercise_params
params.require( :exercise ).permit(
:name,
:is_public,
exercise_equipment_attributes: [
:id,
:optional,
equipment_attributes: [
:id,
:name
],
]
)
end
这是我创建一个视图来做我想做的事:
练习/new.html.erb
<%= form_for @exercise do |f| %>
<%= render 'form', f: f %>
<%= f.submit "New Exercise" %>
<% end %>
练习/_form.html.erb
<%= f.label :name %><br />
<%= f.text_field :name %>
<%= f.check_box :is_public %> Public
<%= f.fields_for( :exercise_equipment ) do |eef|
<%= eef.fields_for( :equipment ) do |ef|
ef.collection_select :id, Equipment.all, :id, :name %>
<% end %>
<%= eef.check_box :is_optional %> Optional
<% end %>
当我将所有这些放在一起并提交对一个已经存在的练习的更新时,这些值都经过了 params 哈希,但不会更改为我选择的新值...
Parameters: {
"utf8"=>"[checkbox]",
"authenticity_token"=>"[token]",
"exercise"=>{
"name"=>"Test",
"is_public"=>"1",
"exercise_equipment_attributes"=>{
"0"=>{
"equipment_attributes"=>{
"id"=>"1"
},
"optional"=>"1",
"id"=>"2"
}
}
},
"commit"=>"Save Exercise",
"id"=>"1"
}
如果你能帮助我,我会非常感激。如果您需要更多信息,请告诉我,我可以提供。
编辑
这是更新前数据库的状态:
postgres@=>db=# select id, name, is_public from exercises;
id | name | is_public
----+------+-----------
2 | Test | t
(1 row)
Time: 61.279 ms
postgres@=>db=# select id, exercise_id, equipment_id, optional from exercise_equipment;
id | exercise_id | equipment_id | optional
----+-------------+--------------+----------
2 | 2 | 1 | t
(1 row)
Time: 58.819 ms
postgres@=>db=# select id, name from equipment where id = 1;
id | name
----+-------------
1 | Freeweights
(1 row)
然后我转到该练习的更新路线,从集合中选择不同的设备,然后提交表格。我得到以下 Rails 控制台结果:
Started PATCH "/exercises/system-test" for 127.0.0.1 at 2014-08-12 23:48:18 -0400
Processing by ExercisesController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"PsbbUPSCiIew2Fd22Swn+K4PmLjwNDCrDdwXf9YBcm8=", "exercise"=>{"name"=>"Test", "is_public"=>"1", "exercise_equipment_attributes"=>{"0"=>{"equipment_attributes"=>{"id"=>"1"}, "optional"=>"1", "id"=>"2"}}}, "commit"=>"Save Exercise", "id"=>"system-test"}
Exercise Load (60.5ms) SELECT "exercises".* FROM "exercises" WHERE "exercises"."slug" = 'system-test' ORDER BY "exercises"."id" ASC LIMIT 1
(57.3ms) BEGIN
ExerciseEquipment Load (76.2ms) SELECT "exercise_equipment".* FROM "exercise_equipment" WHERE "exercise_equipment"."exercise_id" = $1 AND "exercise_equipment"."id" IN (2) [["exercise_id", 2]]
Equipment Load (59.1ms) SELECT "equipment".* FROM "equipment" WHERE "equipment"."id" = $1 LIMIT 1 [["id", 1]]
User Load (60.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 10]]
Exercise Exists (60.5ms) SELECT 1 AS one FROM "exercises" WHERE ("exercises"."name" = 'Test' AND "exercises"."id" != 2 AND "exercises"."user_id" = 10) LIMIT 1
(64.8ms) COMMIT
Redirected to http://localhost:3000/exercises/system-test
Completed 302 Found in 590ms (ActiveRecord: 580.0ms)
Started GET "/exercises/system-test" for 127.0.0.1 at 2014-08-12 23:48:19 -0400
Processing by ExercisesController#show as HTML
Parameters: {"id"=>"system-test"}
Exercise Load (64.1ms) SELECT "exercises".* FROM "exercises" WHERE "exercises"."slug" = 'system-test' ORDER BY "exercises"."id" ASC LIMIT 1
Equipment Load (58.7ms) SELECT "equipment".* FROM "equipment" INNER JOIN "exercise_equipment" ON "equipment"."id" = "exercise_equipment"."equipment_id" WHERE "exercise_equipment"."exercise_id" = $1 [["exercise_id", 2]]
Rendered exercises/show.html.erb within layouts/application (122.7ms)
User Load (60.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = 10 ORDER BY "users"."id" ASC LIMIT 1
Rendered shared/_header.html.erb (61.9ms)
Rendered shared/_alerts.html.erb (0.1ms)
Completed 200 OK in 264ms (Views: 21.3ms | ActiveRecord: 240.8ms)
【问题讨论】:
-
这是您网络服务器的唯一输出吗?它应该告诉你它正在尝试做什么,即 SQL 查询、保存等。
-
我在编辑中包含了来自我的服务器日志的完整 PATCH 跟踪,以及我的初始数据库状态。非常感谢您的观看!
-
在您的嵌套表单中,它是 |e_form|,但您调用
ef.collection_select- 不应该是e_form.collection_select吗? -
嗯。我在维修票/零件使用场景中做了类似的事情。当我加载服务票并更改使用的部件时,它会执行一些
UPDATE和DELETE语句以在数据库中进行更改。我在这里看不到任何东西。我有点生疏,但我知道有多个复选框并更新您必须在表单中使用一些隐藏字段。 -
你的 form_for 助手应该有@exercise。错字?
标签: javascript ruby-on-rails ruby forms ruby-on-rails-4