Ruby on rails 导轨:can';不能正确调用嵌套路由
我有以下路线:Ruby on rails 导轨:can';不能正确调用嵌套路由,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我有以下路线: shallow do resources :countries do resources :airports end end 我在调用其中两条路径时遇到问题 airports\u controller.rb文件开始 def create Rails::logger.debug "!!! Building airport with parameters #{params}" @country = Country.find(params[:country_i
shallow do
resources :countries do
resources :airports
end
end
我在调用其中两条路径时遇到问题
airports\u controller.rb
文件开始
def create
Rails::logger.debug "!!! Building airport with parameters #{params}"
@country = Country.find(params[:country_id])
Rails::logger.debug "!!! Found airport #{@country.name}"
@airport = @country.airports.build(params[:airport])
最后一行给出了错误Minitest::UnexpectedError:ActiveModel::ForbiddenAttributesError:ActiveModel::ForbiddenAttributesError
,但是我调用的参数是
!!! Building airport with parameters {"airport"=>{"iata_code"=>"CCC",
"icao_code"=>"CCCC", "name"=>"Airport 3", "city"=>"City 3", "latitude"=>"1.5",
"longitude"=>"1.5"}, "country_id"=>"980190962", "controller"=>"airports",
"action"=>"create"}
据我所知,所有这些都在我允许的参数中:
def airport_params
params.require(:airport).permit(:iata_code, :icao_code, :name, :city, :latitude, :longitude, :notes, :country_id)
end
其次,我的airports\\u form.html.erb
开始
,但这会给出一个错误Minitest::UnexpectedError:ActionView::Template::error:undefined方法“airports\u path”,用于#
。是的,该路径未定义,但我试图访问路径国家/地区\u机场\u路径
,该路径已定义
那么我在这里遗漏了什么呢?在“def create”中
您已经正确创建了“airport_params”函数,但没有调用它。这应该可以解释禁止属性错误
至于未定义的方法,乍一看它似乎是一个不正确的关联,您的模型是否正确相关(即属于并且有许多)?如果是这样,您可以尝试将url:country\u airports\u path
添加到form\u for
字段中 属性
您收到的属性错误基本上是由于未使用
Rails 4引入了strong_params
,使您能够定义要传递给模型的特定属性(防止质量分配)。问题是您使用的是rails3
方式传递所有属性,而没有将它们白名单
如前所述,您最好这样做:
#app/controllers/airports_controller.rb
Class AirportsController < ApplicationController
def create
@airport = Airport.new(airport_params)
end
private
def airport_params
params.permit(:airport).permit(:your, :params).merge(country_id: params[:country_id])
end
end
如果要创建嵌套表单,最好使用ActiveRecord对象数组,以便向Rails提供使用嵌套资源的知识:
<%= form_for [@country, @airport] do |f| %>
# builds route using "country_airport_path"
<% end %>
#使用“国家/地区/机场/路径”建立路线
您是否尝试过运行rake路由
?因为应该定义机场路径。是的,我运行过rake路线。是的,定义了airport\u path,但代码没有路由到该路径(我不明白为什么应该这样做。我不是在寻找一个机场,我是在寻找一个国家的所有机场:country\u airports\u path,它也定义了,但没有被调用)。为了澄清为什么我不想要airport\u path,当我创建一个机场时,我不想路由到该机场的视图,我想路由回该国所有机场的列表。是的,这就是FrbiddenAttributeError[拍头]的原因。airport.rb开始类airport<%= form_for @airport do |f| %>
# builds route using "airport_path"
<% end %>
<%= form_for [@country, @airport] do |f| %>
# builds route using "country_airport_path"
<% end %>