1

ここで説明されているように、2 つのノード間に関係を作成しようとしています https://github.com/neo4jrb/neo4j/wiki/Neo4j-v3-Declared-Relationships from_node.create_rel("FRIENDS", to_node)

未定義のメソッドを取得していますcreate_rel

私は何を間違っていますか?別のモデル内に Q+A システムを作成しようとしています。したがって、質問と回答の両方が現在モデルとして扱われます。

undefined method# の create_rel を取得しています

event.rb

  has_many :out, :event_questions

event_questions.rb

  has_one :in, :events
  has_many :out, :event_answers

  def create_questions_of(from_node,to_node)
    from_node.create_rel("questions_of", to_node)
  end

event_answer.rb

  has_one :in, :event_questions

event_questions_controller.rb

def new
    #is this needed
end

def create
    @event_question = EventQuestion.new(event_question_params)
    if @event_question.save
        @event = Event.find(params[:id])
        @event_question.update(admin: current_user.facebook_id)
        @event_question.create_questions_of(self,@event)
        redirect_to @event
    else
        redirect_to @event
    end
end

private

    def event_question_params
        params.require(:event_question).permit(:question)
    end

後でイベントに関するすべての質問をリストしたかったので、新しい質問をイベントのインデックス ページ内に置いています。newコントローラーにメソッドさえ必要ありませんよね?また、質問フォームが置かれているイベントを取得する方法もよくわかりません。それはparamsからアクセスできますか?

アップデート

これのことですか

  def create_questions_of(to_node)
    self.create_rel("questions_of", to_node)
  end

 @event_question.create_questions_of(@event)

したがって、ルートも変更し、内部に質問をネストして作成する必要があると思います events/123/questions/

それから私はつかんevents_idで使うことができますfind

更新 #2

events_controller.rb

def show
    @event = Event.find(params[:id])
    @event_question = EventQuestion.new
end

event.rb

  has_many :out, :event_questions, type: 'questions_of'

event_questions.rb

  has_one :in, :events, origin: :event_questions

イベント/show.html.erb

<%= form_for [:event, @event_question] do |f| %>

#form stuff

<% end %>

event_questions_controller.rb

def create
    @event_question = EventQuestion.new(event_question_params)
    if @event_question.save
        @event = Event.find(params[:event_id])
        @event_question.update(admin: current_user.facebook_id)
        @event_question.events << @event
        redirect_to @event
    else
        redirect_to :back
    end
end

ルート.rb

resources :events do
    resources :event_questions, only: [:create, :destroy]
  end
4

1 に答える 1

0

create_rel今テストしたときはうまくいきました。それは言っていundefined method 'create_rel' for nil:NilClassますか?もしそうなら、それはあなたのfrom_node変数が実際にはノードセットを持っていないことを意味します。あなたのオブジェクトがあなたが思っているものであることを確認してください。

ここでのより良い質問: なぜこれをやりたいのですか? 宣言されていない関係を作成する場合、それを使用したい場合はいつでも独自の Cypher クエリを作成する必要があります。それがコードの一部であり、定期的に使用している場合は、おそらくhas_manyモデルに関連付けが必要です。create_relモデルを持たないノードとの相互運用性を提供するためにのみ存在します。

new他の質問については、それに対応するルートとビューがない限り、アクションは必要ありません。インデックス ページで新しい質問のフォームを読み込んでいる場合は、問題ありません。URL が のようなものhttp://127.0.0.1:3000/events/123/questions/である場合、イベント ID を で取得できますparams[:event_id]。プロジェクトのディレクトリからコマンドを実行するrake routesと、パラメーター名を含む多くの情報が吐き出されます。

最後に、 in を使用するself@event_question.create_questions_of(self,@event)、コントローラーが取得されます。を参照する場合は@event_question、その最初の引数をメソッドから削除して、メソッド内create_questions_ofで使用selfします。

編集:パート2

がコントローラであるundefined methodためself、取得しています。@event_question.create_questions_of(self,@event)@event_question をそれ自体に送信しようとしていると思います。self内部から呼び出すだけで、create_questions_of現在の EventQuestion を取得できます。

コールバック、検証、プロパティなどが必要な場合は ActiveRel を使用します...単純な関係だけが必要な場合はhas_many、各モデルで関連付けをセットアップし、 を省略rel_classして、両方を同じに設定するか、1 つにtype設定originします。

class Event
  include Neo4j::ActiveNode
  has_many :in, :event_questions, type: 'questions_of'
end

class EventQuestion
  include Neo4j::ActiveNode
  has_many :out, :events, origin: :event_questions
end

origin「相互モデルでこの関連付けを探し、それが定義する型を使用してください。」これにより、関連付け間で型を同期することについて心配する必要がなくなります。

その後、できるよう@event_question.events << @eventになり、新しい関係が作成されます。

于 2014-11-11T18:03:22.630 に答える