形式偏的未定义模型方法

时间:2014-05-16 00:32:19

标签: ruby-on-rails

我正在尝试在用户可以参加或无人参与某个活动的模型之间创建关系。

Presence 模型中,我有:

class Presence < ActiveRecord::Base
  belongs_to :member, class_name: "User"
  belongs_to :event, class_name: "Events"
  validates :member_id, presence: true
  validates :event_id, presence: true
end

我的用户型号:

class User < ActiveRecord::Base
  ...
      has_many :presences, foreign_key: "member_id", dependent: :destroy
      has_many :event_presence, through: :presences, source: :event
  ...
end

事件模型:

class Events < ActiveRecord::Base
    has_many :presences, foreign_key: "event_id"
    has_many :reverse_presences, foreign_key: "event_id",
                                       class_name:  "Presence",
                                       dependent:   :destroy
    has_many :members, through: :reverse_presences, source: :member

  def event?(other_event)
    presences.find_by(event_id: other_events.id)
  end
end

当我尝试在我的部分中使用event?方法时:

<div id="attend_form">
  <% if event?(@events) %>
    <%= render 'unattend' %>
  <% else %>
    <%= render 'attend' %>
  <% end %>
</div>

我收到错误:undefined method "event?"'

当我将方法移动到我的控制器助手时,错误没有显示但是我得到一个未定义的方法"presences"。我是rails的新手,但据我所知,在第二种情况下,方法无法识别,因为帮助器中的模型之间没有关系,但我无法弄清楚为什么当方法在模型。

由于

修改

class EventsController < ApplicationController

def event1
  @events = Events.find(params[:id])
    end
end

2 个答案:

答案 0 :(得分:1)

event?(other_event)是一个模型属性。就像你的任何其他模型属性一样。 你必须在它上面调用对象。喜欢这个

#index.html.erb

<% @events.each do |event| %>  #this line should go inside the index view
  <% render partial %>
<% end %>

#partial

  <div id="attend_form">
   <% if event.event?(event) %>
     <%= render 'unattend' %>
   <% else %>
     <%= render 'attend' %>
   <% end %>
 </div>

您无法将@vents作为参数传递给方法:(event?(@events)因为@events是一个对象数组。所以你想要一个单一的实例。

另外,我认为您的def event?(other_event)方法中有TYPO。它应该是other_event.id而不是other_events.id

更新:

@events = Events.find(params[:id])不是数组,因此无法在其上调用each方法。这是一个奇特的事件。要遵循惯例并避免混淆,请将@events重命名为@event

@event = Events.find(params[:id])

然后在视图中,执行此操作:

<div id="attend_form">
   <% if @event.event?(@event) %>
     <%= render 'unattend' %>
   <% else %>
     <%= render 'attend' %>
   <% end %>
 </div>

答案 1 :(得分:0)

对于初学者,您的模型应该被称为Event。 Rails中的模型总是单一的。


event?方法在模型中定义,您尝试在视图中调用它。模型和视图没有以这种方式连接。

您可能想要做的是确定此人是否参加或未参加活动。在这个例子中我要做的是调用current_user.attending?(@event)之类的方法。这真的是你想要做的:确定当前用户是否参加当前事件。

方法将如下定义:

def attending?(event)
  presences.exists?(event_id: event.id)
end