Ruby on rails 验证保存前必须运行另一个模型的Rails表单字段

Ruby on rails 验证保存前必须运行另一个模型的Rails表单字段,ruby-on-rails,Ruby On Rails,我有一个RubyonRailsRuby2.5.1,Rails5.1应用程序,它处理航班;除此之外,它有一个航班模型和一个航空公司模型,航班属于:航空公司,航空公司有许多:航班。航空公司有一个iata_代码列,其中包含两个字母的iata航空公司代码,即AA、UA、WN、F9 对于航班输入表单,我希望用户能够输入任意IATA代码,而不是从下拉列表中选择航空公司。如果用户输入的IATA代码与航空公司表中的记录匹配,则Flight.Airline_id列应设置为该航空公司的id。如果IATA代码与我的数

我有一个RubyonRailsRuby2.5.1,Rails5.1应用程序,它处理航班;除此之外,它有一个航班模型和一个航空公司模型,航班属于:航空公司,航空公司有许多:航班。航空公司有一个iata_代码列,其中包含两个字母的iata航空公司代码,即AA、UA、WN、F9

对于航班输入表单,我希望用户能够输入任意IATA代码,而不是从下拉列表中选择航空公司。如果用户输入的IATA代码与航空公司表中的记录匹配,则Flight.Airline_id列应设置为该航空公司的id。如果IATA代码与我的数据库中的航空公司不匹配,则应使用提供的IATA代码创建该航空公司,并且应将新航空公司的id分配给Flight.Airline_id

目前,我在添加/编辑航班表单中有一个航空公司IATA代码字段。注意,表单字段的名称为:Airline\u IATA,而不是:Airline\u id:

这种方法对我很有效,只是我无法从航班表中找出如何对航空公司IATA代码字段进行验证。航空公司模型验证代码存在性:true,长度:{is:2},唯一性:{区分大小写:false},因此如果用户输入无效的IATA代码,航空公司创建将失败,因此航班创建将失败。但是,我不会在航班表单上看到常见的验证错误,例如错误消息、突出显示错误的表单字段,因为航班的问题在于不直接在航班表单上的航空公司id不存在,而不是航班表单中的航空公司iata无效


我如何设置它,以便在提交之前必须与机场模型交互的表单字段可以在航班表单字段上运行机场模型的验证,并相应地返回表单验证错误?

您可以尝试使用嵌套表单属性并添加将覆盖关联的“验证前挂钩”:

<%= f.fields_for :airline do |airline_form| %>
  <%= airline_form.label :iata_code, "Airline code" %>
  <%= airline_form.text_field :iata_code %>
<% end %>

正是我所需要的;谢谢有一段时间我确实被绊倒了,因为我忘了我还需要向flight_参数散列中添加airline_属性:[:iata_代码],所以如果其他人有问题,记得检查你的参数散列。
def create
  params[:flight][:airline_id] = Airline.find_or_create_by!(:iata_code => params[:flight][:airline_iata].upcase).id
  @flight = current_traveler.flights.build(flight_params)

  if @flight.save
    redirect_to event_path(current_traveler.event)
  else
    render "new"
  end

end
<%= f.fields_for :airline do |airline_form| %>
  <%= airline_form.label :iata_code, "Airline code" %>
  <%= airline_form.text_field :iata_code %>
<% end %>
accept_nested_attributes_for :airline
before_validation :check_existing_airline, on: :create

def check_existing_airline
  if airline.new_record? && existing_airline = Airline.find_by(iata_code: airline.iata_code)
    self.airline = exisitng_airline
  end
end