2017-08-18 11 views
0

私は2つのモデルのユーザーとサーバーを作成しましたが、サーバーにデータを追加しようとしたときに、私が望む結果を得ることができません。これをRails Consoleで試したところ、エラーは発生していません。これは今、私の頭を2日間狂っています。たくさんのことを試しました。RoR Active Records未定義のメソッド

user.rb

class User < ApplicationRecord 
    belongs_to :server 
end 

ユーザー移行

class CreateUsers < ActiveRecord::Migration[5.0] 
    def change 
    create_table :users do |t| 
     t.integer :channel_id 
     t.timestamps 

    end 
    end 
end 

server.rb

class Server < ApplicationRecord 
has_many :user 
end 

Server移行

class CreateServers < ActiveRecord::Migration[5.0] 
    def change 
    create_table :servers do |t| 
     t.string :name 
     t.timestamps 
    end 
    end 
end 

マイコントローラー:

def alert(args) 
@server = Server.where(name: args) 
    if @server == [] 
    Server.create(name: args) 
    respond_with :message, text: t('.bildirim_on') 
    else 
    end 
    @user = @server.user.create(channel_id: 215682104) 
end 

私はこのエラーを取得しています:

Server Load (0.1ms) SELECT "servers".* FROM "servers" WHERE "servers"."name" = ? [["name", "videoyun"]] 
Completed in 28ms (ActiveRecord: 0.8ms) 
undefined method `user' for #<Server::ActiveRecord_Relation:0x00000004dae158> 

答えて

3

@serverActiveRecord_Relationship、ないServerインスタンスであるためです。 Server.find_by(name: args)を使用し、作成する前に.present?であることを確認する必要があります(ActiveRecord関係の代わりにServerインスタンスまたはnilを返します)。

また、if文内で新しいものを@serverに割り当てる必要があります。

+0

でなければなりません。しかし、なぜ 'Server.where(name:* args)'が動作していないのか、 'Server.find_by'が働いています。私はまだ彼らの違いを理解することができませんでした。 –

+1

'where'はサーバの配列(配列インスタンスではありませんが似ています)を返し、' find_by'はサーバのインスタンスを返します(配列の代わりに)。 –

0
class Server < ApplicationRecord 
has_many :user 
end 

:user作業この1 :users

関連する問題