Ruby on rails Rails 4:强参数和传递数据的问题
大家好 首先,我是Rails的新手。四年前我在大学里做过一些事情,现在我决定重新开始。在版本4中,很多事情都发生了变化 无论如何,我遇到了强参数问题。以下是我所拥有的: 我使用的是Ruby 2.1和Rails 4.1 我正在尝试为曲棍球比赛创建一个带有参数(id、a队、b队、竞技场、日期、得分a、得分b)的表单。团队是一张桌子(id,名称),竞技场是一张桌子(id,名称) 当我将参数从表单传递到控制器时,json参数似乎没有问题。但是,当它转换为match_params时,它缺少来自其他表的参数的一些值。例如,我经过arena_id:12,但它显示arena_id:12为空 我在这件事上花了5天多的时间。谢谢你的帮助 下面是一些代码。如果您需要我提供更多信息,请告诉我 迁移数据Ruby on rails Rails 4:强参数和传递数据的问题,ruby-on-rails,ruby,ruby-on-rails-4,model,strong-parameters,Ruby On Rails,Ruby,Ruby On Rails 4,Model,Strong Parameters,大家好 首先,我是Rails的新手。四年前我在大学里做过一些事情,现在我决定重新开始。在版本4中,很多事情都发生了变化 无论如何,我遇到了强参数问题。以下是我所拥有的: 我使用的是Ruby 2.1和Rails 4.1 我正在尝试为曲棍球比赛创建一个带有参数(id、a队、b队、竞技场、日期、得分a、得分b)的表单。团队是一张桌子(id,名称),竞技场是一张桌子(id,名称) 当我将参数从表单传递到控制器时,json参数似乎没有问题。但是,当它转换为match_params时,它缺少来自其他表的参数
class CreateMatches < ActiveRecord::Migration
def change
create_table :matches do |t|
t.references :team_a, default: 1 # unknown
t.references :team_b, default: 1 # unknown
t.references :arena, default: 1 # unknown
t.datetime :date
t.integer :score_a
t.integer :score_b
t.timestamps
end
add_index :matches, :team_a_id
add_index :matches, :team_b_id
add_index :matches, :arena_id
end
end
class CreateTeams < ActiveRecord::Migration
def change
create_table :teams do |t|
t.string :name, null: false
t.timestamps
end
end
end
class CreateArena < ActiveRecord::Migration
def change
create_table :arena do |t|
t.string :name, null: false
t.timestamps
end
end
end
当您调用此项时,除名称外的所有内容都将被删除:
params.require(:arena).permit(:name)
当您调用此项时,除名称外的所有内容都将被删除:
params.require(:arena).permit(:name)
当您调用此项时,除名称外的所有内容都将被删除:
params.require(:arena).permit(:name)
当您调用此项时,除名称外的所有内容都将被删除:
params.require(:arena).permit(:name)
查看您的
匹配参数
,并将其与从表单传递给控制器的参数进行比较
def match_params
params.require(:match).permit(:date, :score_a, :score_b, team_a_id: [:id, :name], team_b_id: [:id, :name], area_id: [:id, :name])
end
Parameters: {"utf8"=>"✓", "authenticity_token"=>"0RJjnpczVkp2unG9VITyHYC89ThgELn5kVE2wYRymBU=", "match"=>{"team_a_id"=>"24", "team_b_id"=>"27", "arena_id"=>"21", "date(1i)"=>"2014", "date(2i)"=>"5", "date(3i)"=>"6", "date(4i)"=>"18", "date(5i)"=>"24"}, "commit"=>"Update"}
您允许您的竞技场id
在匹配参数中作为一个名为区域id
的数组,包含元素:id
和:name
。但是,它只是作为arena\u id
从表单中传递过来的。您应该将match_params
函数更改为:
def match_params
params.require(:match).permit(:date, :score_a, :score_b, :team_a_id, :team_b_id, :arena_id)
end
请注意,我还将:team_a_id
和:team_b_id
更改为与在参数中传递的内容一致,尽管看起来您没有传递:score_a
或:score_b
。您应该查看rails指南以了解更多信息。查看您的匹配参数,并将其与从表单传递给控制器的参数进行比较
def match_params
params.require(:match).permit(:date, :score_a, :score_b, team_a_id: [:id, :name], team_b_id: [:id, :name], area_id: [:id, :name])
end
Parameters: {"utf8"=>"✓", "authenticity_token"=>"0RJjnpczVkp2unG9VITyHYC89ThgELn5kVE2wYRymBU=", "match"=>{"team_a_id"=>"24", "team_b_id"=>"27", "arena_id"=>"21", "date(1i)"=>"2014", "date(2i)"=>"5", "date(3i)"=>"6", "date(4i)"=>"18", "date(5i)"=>"24"}, "commit"=>"Update"}
您允许您的竞技场id
在匹配参数中作为一个名为区域id
的数组,包含元素:id
和:name
。但是,它只是作为arena\u id
从表单中传递过来的。您应该将match_params
函数更改为:
def match_params
params.require(:match).permit(:date, :score_a, :score_b, :team_a_id, :team_b_id, :arena_id)
end
请注意,我还将:team_a_id
和:team_b_id
更改为与在参数中传递的内容一致,尽管看起来您没有传递:score_a
或:score_b
。您应该查看rails指南以了解更多信息。查看您的匹配参数,并将其与从表单传递给控制器的参数进行比较
def match_params
params.require(:match).permit(:date, :score_a, :score_b, team_a_id: [:id, :name], team_b_id: [:id, :name], area_id: [:id, :name])
end
Parameters: {"utf8"=>"✓", "authenticity_token"=>"0RJjnpczVkp2unG9VITyHYC89ThgELn5kVE2wYRymBU=", "match"=>{"team_a_id"=>"24", "team_b_id"=>"27", "arena_id"=>"21", "date(1i)"=>"2014", "date(2i)"=>"5", "date(3i)"=>"6", "date(4i)"=>"18", "date(5i)"=>"24"}, "commit"=>"Update"}
您允许您的竞技场id
在匹配参数中作为一个名为区域id
的数组,包含元素:id
和:name
。但是,它只是作为arena\u id
从表单中传递过来的。您应该将match_params
函数更改为:
def match_params
params.require(:match).permit(:date, :score_a, :score_b, :team_a_id, :team_b_id, :arena_id)
end
请注意,我还将:team_a_id
和:team_b_id
更改为与在参数中传递的内容一致,尽管看起来您没有传递:score_a
或:score_b
。您应该查看rails指南以了解更多信息。查看您的匹配参数,并将其与从表单传递给控制器的参数进行比较
def match_params
params.require(:match).permit(:date, :score_a, :score_b, team_a_id: [:id, :name], team_b_id: [:id, :name], area_id: [:id, :name])
end
Parameters: {"utf8"=>"✓", "authenticity_token"=>"0RJjnpczVkp2unG9VITyHYC89ThgELn5kVE2wYRymBU=", "match"=>{"team_a_id"=>"24", "team_b_id"=>"27", "arena_id"=>"21", "date(1i)"=>"2014", "date(2i)"=>"5", "date(3i)"=>"6", "date(4i)"=>"18", "date(5i)"=>"24"}, "commit"=>"Update"}
您允许您的竞技场id
在匹配参数中作为一个名为区域id
的数组,包含元素:id
和:name
。但是,它只是作为arena\u id
从表单中传递过来的。您应该将match_params
函数更改为:
def match_params
params.require(:match).permit(:date, :score_a, :score_b, :team_a_id, :team_b_id, :arena_id)
end
请注意,我还将:team_a_id
和:team_b_id
更改为与在参数中传递的内容一致,尽管看起来您没有传递:score_a
或:score_b
。您应该查看rails指南以了解更多信息。好的,我发现了我的错误。(感谢JKen13579)
我把params放错地方了
应该是这样的:
def match_params
params.require(:match).permit(:date, :score_a, :score_b, :team_a_id, :team_b_id , :arena_id)
end
def team_params
params.require(:team).permit(:name, matches_params:[:id, :match_id, :name])
end
def arena_params
params.require(:arena).permit(:name, matches_params:[:id, :match_id, :name])
end
它解决了问题。好的,我发现了我的错误。(感谢JKen13579)
我把params放错地方了
应该是这样的:
def match_params
params.require(:match).permit(:date, :score_a, :score_b, :team_a_id, :team_b_id , :arena_id)
end
def team_params
params.require(:team).permit(:name, matches_params:[:id, :match_id, :name])
end
def arena_params
params.require(:arena).permit(:name, matches_params:[:id, :match_id, :name])
end
它解决了问题。好的,我发现了我的错误。(感谢JKen13579)
我把params放错地方了
应该是这样的:
def match_params
params.require(:match).permit(:date, :score_a, :score_b, :team_a_id, :team_b_id , :arena_id)
end
def team_params
params.require(:team).permit(:name, matches_params:[:id, :match_id, :name])
end
def arena_params
params.require(:arena).permit(:name, matches_params:[:id, :match_id, :name])
end
它解决了问题。好的,我发现了我的错误。(感谢JKen13579)
我把params放错地方了
应该是这样的:
def match_params
params.require(:match).permit(:date, :score_a, :score_b, :team_a_id, :team_b_id , :arena_id)
end
def team_params
params.require(:team).permit(:name, matches_params:[:id, :match_id, :name])
end
def arena_params
params.require(:arena).permit(:name, matches_params:[:id, :match_id, :name])
end
它解决了这个问题。SP悄悄地吃掉了未经许可的参数。识别开发中可能需要允许的参数的一种快速方法是在Rails配置中设置config.action\u controller.action\u on\u unpermitted\u parameters=:raise
。它会抱怨参数是合法的,但应该被忽略,所以它实际上只是在需要时暂时使用的东西。SP悄悄地吃未经许可的参数。识别开发中可能需要允许的参数的一种快速方法是在Rails配置中设置config.action\u controller.action\u on\u unpermitted\u parameters=:raise
。它会抱怨参数是合法的,但应该被忽略,所以它实际上只是在需要时暂时使用的东西。SP悄悄地吃未经许可的参数。识别开发中可能需要允许的参数的一种快速方法是在Rails配置中设置config.action\u controller.action\u on\u unpermitted\u parameters=:raise
。它会抱怨params是合法的,但是