0

rails-jquery-autocomplete を使用してcabinet_name、次のようなフォームに入力しています。

<%= autocomplete_field_tag :cabinet_name, '', cabinets_autocomplete_cabinet_name_path %>

他のデータとともに、デバイス コントローラーに渡されるパラメーターは次のとおりです。

{"utf8"=>"✓",
"authenticity_token"=>"/0yFGrlBy0y+2ksTkQN50Dmfpw7ZWBKsO2zswAigJZI=",
"device"=>{"name"=>"Test dropdown",
"device_model_id"=>"621",
"device_unit_count"=>"1",
 "position"=>"1",
 "row_id"=>"1"},
 "cabinet_name"=>"0055-COMM-ANNEX-C3",
 "commit"=>"Create Device"}

ご覧のとおり、ハッシュcabinet_nameに が渡されていることは間違いありません。deviceのコードは次のdevices_controllerとおりです。

def create
  if params[:cabinet_name]
    @cabinet = Cabinet.where("name LIKE ? ", params[:cabinet_name])
  else
    @cabinet = Cabinet.find(params[:device][:cabinet_id])
  end
...
 @device.row_id = @cabinet.row_id

コマンド ライン出力に従って実行されるクエリを次に示します。次の点に注意してください。

  ←[1m←[35mCabinet Load (2.9ms)←[0m  SELECT `cabinets`.* FROM `cabinets` WHERE (
name LIKE '0055-COMM-ANNEX-C3' )

以下は、1 つのキャビネット レコードの結果を示す手動クエリと実行結果です。

mysql> select `cabinets`.* from `cabinets` where name like '0055-COMM-ANNEX-C3'


---------------+
| id   | name               | row_id | data_center_id | cabinet_type_id | creat
d_at          | updated_at          | row_name | cabinet_name | capacity_used |
not_cabinet | grid_location_name | grid_location_id | is_rack | alias_name
   | room_id | mark_review | mark_validated | mark_audit | last_audit_note | ma
k_deleted | purpose | total_power_kpm | total_max_power_kpm | total_heat_btu |
otal_max_heat_btu | total_heat_kpm | total_max_heat_kpm | total_spec_ratings |
ean_efficiency |

------------------+----------------+--------------------+--------------------+-
---------------+
| 1389 | 0055-COMM-ANNEX-C3 |   NULL |              3 |               1 | 2012-
1-05 21:55:23 | 2012-11-21 16:21:34 | C3       | C3           |             2 |
       NULL | C3                 |             2287 |       0 | 0055-COMM-ANNEX
C3 |       4 |        NULL |           NULL |       NULL | NULL            |
     NULL | NULL    |              42 |                  64 |            200 |
              280 |              8 |                 10 |                  0 |
          NULL |

------------------+----------------+--------------------+--------------------+-
---------------+
1 row in set (0.00 sec)

キャビネットが選択されたことを示すブラウザーがスローするエラーは次のとおりです。

undefined method `row_id' for #<ActiveRecord::Relation:0x5845368>

問題が理解できた方、アドバイスをお願いします。ありがとう。

4

3 に答える 3

2

@device.row_idを呼び出して@deviceいるため、このエラーが表示されますCabinet.where("name LIKE ? ", params[:cabinet_name])。キャビネット名が のような最初のキャビネットが必要な場合は、次のようparams[:cabinet_name]に変更します。

Cabinet.where("name LIKE ? ", params[:cabinet_name]).first

row_idその後、期待どおりに呼び出すことができます。基本的に、 のインスタンスではなくを呼び出しrow_idています。ActiveRecord::RelationCabinet

于 2013-04-03T16:52:10.050 に答える
1
    @cabinet = Cabinet.where("name LIKE ? ", params[:cabinet_name])

その行は結果のコレクションを返すため、コレクションから ID を取得しようとすると、コードが爆破されます。

次のようなことができます:

    @cabinet = Cabinet.where("name LIKE ? ", params[:cabinet_name]).first

最初の結果を取得します。

于 2013-04-03T16:53:35.530 に答える