2017-08-18 4 views
0

Ich erstellte 2 Modelle Benutzer und Server, aber wenn ich versuchte, eine Daten zu Server hinzufügen, kann ich nicht das Ergebnis, das ich will. Wenn ich dies auf der Rails-Konsole versuchte, erhalte ich keine Fehler. Das macht meinen Kopf seit 2 Tagen verrückt. Ich habe viele Dinge probiert.RoR Active Records undefined Methode

user.rb

class User < ApplicationRecord 
    belongs_to :server 
end 

Benutzermigration

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 Migration

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

Mein Controller:

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 

ich diese Störung erhalte:

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> 

Antwort

3

Das ist, weil @server ein ActiveRecord_Relationship, kein Server Instanz. Sie sollten Server.find_by(name: args) verwenden und überprüfen, ob es .present? ist, bevor Sie es erstellen (es wird eine Serverinstanz oder Nil anstelle einer ActiveRecord-Beziehung zurückgegeben).

Auch Sie sollten @server das neue innerhalb der if-Anweisung zuweisen.

+0

sein. Aber warum 'Server.where (name: * args)' nicht funktioniert und 'Server.find_by' funktioniert. Ich konnte den Unterschied zwischen ihnen immer noch nicht verstehen. –

+1

Weil 'where' ein" Array "von Servern zurückgibt (es ist keine Array-Instanz, ist aber ähnlich), und' find_by' gibt eine Instanz des Servers zurück (anstelle eines "Arrays"). –

0
class Server < ApplicationRecord 
has_many :user 
end 

:user sollte dieser eine Arbeits :users

Verwandte Themen