저는 C ++ 프로그래머이므로 제목에 무엇이 들어가야할지 잘 모르겠습니다. 내가 생각하기에 가능한 한 예제를 제거했습니다.
레일스 4.1.5, 루비 2.0.0p353, Rubymine 6.3.3, Fedora 20
이 문제가 왜 발생하는지 모르겠습니다. 마이그레이션시 기본 관리자로 데이터베이스를 채우려 고하는데 .NET을 실행하는 동안 정의되지 않은 메서드가 나타납니다 rake db:migrate
.
첫째, 모델
class Login < ActiveRecord::Base
belongs_to :user, polymorphic: true
end
class Admin < ActiveRecord::Base
has_one :login, :as=>:user, :dependent => :destroy, :autosave => true
accepts_nested_attributes_for :login
def method_missing(symbol, *args)
self.login.send(symbol,*args)
end
end
기본적으로 admin과 login 사이에는 "is_a"관계가 있습니다 (실제 애플리케이션에는 로그인이 될 수도있는 다른 레코드가 있지만 필드가 서로 다릅니다).
다음으로 마이그레이션
** _ create_logins.rb
class CreateLogins < ActiveRecord::Migration
def change
create_table :logins do |t|
t.string :username
t.string :password
t.references :user, polymorphic: true
t.timestamps
end
end
end
** _ create_admins.rb
class CreateAdmins < ActiveRecord::Migration
def change
create_table :admins do |t|
t.string :name
t.timestamps
end
end
end
이 응용 프로그램의 나머지 부분에서 잘 작동 : 나는에서 다형성 방식의 관리자 또는 무엇이든을 얻을 호출 할 수 login
호출하여 login.user
. 관리자 컨트롤러에서 관리자를 쉽게 추가 할 수 있습니다. 그들은 모두 데이터베이스를 잘 업데이트하고 있습니다. 모두가 좋은 시간을 보냈습니다.
마지막으로 "기본 관리자 만들기 :
** _ create_default_admin.rb
class CreateDefaultAdmin < ActiveRecord::Migration
def self.up
down();
Admin.create(:name=>'Default Admin', :login_attributes=>{:username=>'admin', :password=>'password'})
end
def self.down
Admin.delete_all
end
end
따라서 단일 기본 관리자를 만들려고한다는 것을 알 수 있습니다.
내가 달리려고 할 때
rake db:drop
rake db:create
rake db:migrate
나는 얻다
undefined method `name=' for nil:NilClass/home/asdf/RubymineProjects/untitled/app/models/admin.rb:11:in `method_missing'
어떤 이유로 이름 기호가 생성되지 않고 로깅이 nil입니다.
method_missing 쇼에 중단 점을 넣는 것은 self.login
사실 nil
, 나는 이상하다고 생각했습니다. super에 중단 점을 놓으면 로그인이 생성됩니다. 중단 점을 super에 넣은 후에 실행하면 절대 method_missing
. 대신
unknown attribute: user_id/home/asdf/RubymineProjects/untitled/app/models/admin.rb:7:in `initialize'
질문
업데이트 : 생성을 이동하면 오류가 발생합니다 seed.rb
. Update2 : 문제의 원인이 누락 된 방법 (문제가 해결 된 것으로 보이는 제거)이라는 것을 확인했습니다. 이제 누락 된 방법이 왜 나쁜지, 그리고 그것을 고치는 방법은 무엇입니까?
문제는 내가 super
메소드 누락을 호출하지 않는다는 것 입니다. super
메시지가 처리되지 않으면 누락 된 메서드 를 호출해야합니다 .
더 많이 알수록
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다