ruby-on-rails - 为什么我不能用参数创建对象?
问题描述
几天来我一直在为一个问题而烦恼。我无法使用表单中的参数创建对象。我的表格:
<%= form_with(model: @battle, local: true) do |form| %>
<div class="field">
<%= form.collection_select(:team_id, @teams, :id, :name) %>
</div>
<%= form.submit 'Submit'%>
<% end %>
在这种形式中,我只想选择 1 个团队。
控制器:
def create
@battle = Battle.new
@battle.user_id = current_user.id
@battle.team_ids = params[:team_id]
if @battle.save
redirect_to root_path, notice: "Battle has been created"
else
render :new
end
end
def battle_params
params.require(:battle).permit(:team_id)
end
并且在使用时,此表单会创建一个对象,而不涉及团队。
日志:
Processing by BattlesController#create as HTML
Parameters: {"authenticity_token"=>"0wWoFrQXYkEsXsMRgGyKi5Mde7WndhI6zYWY4KvhQlgdcCAaCZqH1z1z9dK0x91iqOPw/Jsb2T6Q+EVtGz4VsA==", "battle"=>{"team_id"=>"14"}, "commit"=>"Submit"}
User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["id", 1], ["LIMIT", 1]]
↳ app/controllers/battles_controller.rb:14:in `create'
Team Load (0.4ms) SELECT "teams".* FROM "teams" WHERE 1=0
↳ app/controllers/battles_controller.rb:15:in `create'
(0.4ms) BEGIN
↳ app/controllers/battles_controller.rb:16:in `create'
User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]]
↳ app/controllers/battles_controller.rb:16:in `create'
Battle Create (3.8ms) INSERT INTO "battles" ("user_id", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id" [["user_id", 1], ["created_at", "2020-06-19 10:28:28.036147"], ["updated_at", "2020-06-19 10:28:28.036147"]]
如果我尝试与两个团队创建一场战斗,但它将只创建一个(不使用参数):
@battle.team_ids = [params[:team_id], 14]
虽然,在控制台中创建了一场没有问题的战斗:
battle = Battle.new
battle.team_ids = [13, 14]
我不明白问题可能是什么。
解决方案
而不是params[:team_id]
尝试使用battle_params[:team_id]
:
@battle.team_ids = battle_params[:team_id]
否则你需要调用params[:battle][:team_id]
这不是 Rails 方式,因为它不安全,但它仍然可以工作。
推荐阅读
- ios - UITextField 在按钮单击时为零,但在更改时有效
- javascript - 如何根据输入值自动生成行?
- linux - 如何使用批处理脚本跨平台将文本附加到文件
- java - 如何使用 spring data jpa 实现延迟加载?
- python - TemplateDoesNotExist 在 /board/boards
- mysql - mysql子查询错误'where子句'中的未知列'tv.last_time'
- mysql - 子查询值的总和
- python - pycrypto 需要 Visual Studio?
- python - 从矩阵创建随机数组
- asp.net - 如果正则表达式有效,如何启用按钮