【问题标题】:Instead of pre-fill field, I get Undefined method `name' for ["Yes", true]:Array我得到 ["Yes", true]:Array 的未定义方法“名称”而不是预填充字段
【发布时间】:2020-02-24 11:05:09
【问题描述】:

当我想编辑我的表单或出现验证错误时,我无法预先填写关联字段。

  • 如果我为 name 添加 label_method,我会收到错误消息 undefined method `name' for ["Yes", true]:Array

  • 或者,当我删除 label_method 时,表单字段仅显示 'Yes' 而不是字段名称(“房间”的名称)。

    李>

new.js.erb

$("#dynamic-rooms").empty();
<% @rooms.each do |acc| %>
    $("#dynamic-rooms").append('<option value="<%= acc.id %>"><%= acc.name %></option>')
<% end %>

form.html.erb

<%= simple_form_for [@hotel, @reservation] do |f|%>
  <%= f.simple_fields_for :rooms do |room| %>
    <%= room.input :room_type, collection: @room_type_list, prompt: "Select type of room", label:false,
        input_html:{
        id: "room_type"
      }%>
    <% end %>

    <%= f.association :room, collection: @rooms,  input_html:{
      value: @rooms.object_id,
      id: "dynamic-rooms"
    } %>
  <% end %>
<% end %>

<script>
   $(document).ready(function(){
    var room_type = $("#room_type").val();

    $.ajax({
      url: "/hotels/<%= @hotel.id %>/reservations/new",
      method: "GET",
      dataType: "json",
      data: {room_type: room_type},
      error: function (xhr, status, error) {
        console.error('AJAX Error: ' + status + error);
      },
      success: function (response) {
    }
  });
  });

   $(document).on("change", "#room_type", function(){
    var room_type = $("#room_type").val();

    $.ajax({
      url: "/hotels/<%= @hotel.id %>/reservations/new",
      method: "GET",
      dataType: "json",
      data: {room_type: room_type},
      error: function (xhr, status, error) {
        console.error('AJAX Error: ' + status + error);
      },
      success: function (response) {
    }
  });
  });
</script>

控制器

class ReservationsController < ApplicationController
  # skip_before_action :authenticate_user!
  def new
    @user = current_user
    @hotel = Hotel.find(params[:hotel_id])
    @reservation = Reservation.new
    @room_type_list = @hotel.room_types
    @rooms = []
    if params[:room_type].present?
      @rooms = RoomType.find(params[:room_type]).rooms
    end
    if request.xhr?
      respond_to do |format|
        format.json {
        render json: {rooms: @rooms}
      }
        format.js
      end
    end

    authorize @reservation
  end

  def create
    @user = current_user
    @hotel = Hotel.find(params[:hotel_id])
    @reservation = Reservation.new(reservation_params)
    @reservation.hotel = @hotel
    authorize @reservation
    if @reservation.save
      redirect_to hotel_path(@hotel)
    else

      # @room_type = @reservation.room.room_type
      @room_type_list = @hotel.room_types
      # @room = @reservation.room
      render 'new'


    end
  end

  private
    def reservation_params
      params.require(:reservation).permit(:room_id, :arrival, :departure, :payment, :reservation_contact_id, option_ids:[],
      reservation_contact_attributes: [:id, :first_name,
      :last_name, :zipcode, :city, :street, :street_number],
        rooms_attributes: [:id,:name, :room_type_id,
          room_types_attributes: [:id, :name]])
  end
end

【问题讨论】:

    标签: javascript jquery ruby-on-rails activerecord simple-form


    【解决方案1】:

    错误表示这段代码

    <%= acc.name %>
    

    acc 是 Array 包含 ["Yes",true] 而不是 Room 对象。

    您在 RoomType 类中有一个实例方法 .rooms。仔细检查该方法是否返回正确的 Room 对象。

    【讨论】:

    • 感谢您的回复。问题确实出在@rooms,但前提是它不是通过if params[:room_type].present? @rooms = RoomType.find(params[:room_type]).rooms end 呈现的。 room_type 设置为空,因此 room 字段也是如此,但我不知道如何解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多