Ruby on rails 部分形式的未定义模型方法
我试图在模型之间建立关系,在这种关系中,用户可以参加或不参加某个活动 在我的车型中,我有:Ruby on rails 部分形式的未定义模型方法,ruby-on-rails,Ruby On Rails,我试图在模型之间建立关系,在这种关系中,用户可以参加或不参加某个活动 在我的车型中,我有: 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 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
我得到错误:未定义的方法“event?”
当我将方法移动到控制器的助手时,错误不会显示,但是我得到了一个未定义的方法“presences”
。我是rails新手,但我知道在第二种情况下,该方法无法识别,因为助手中的模型之间没有关系,但我无法理解为什么当该方法位于模型中时它不起作用
谢谢
编辑
class EventsController < ApplicationController
def event1
@events = Events.find(params[:id])
end
end
类事件控制器
对于初学者,您的模型应该被称为事件
。Rails中的模型总是单一的
事件?
方法在模型中定义,您正试图在视图中调用它。模型和视图不会以这种方式连接
您可能想做的是确定此人是否已经参加了活动。在本例中,我要做的是调用一个方法,例如current\u user.atting?(@event)
。这就是您真正想要做的:确定当前用户是否正在参加当前活动
该方法的定义如下:
def attending?(event)
presences.exists?(event_id: event.id)
end
event?(其他事件)
是一个模型属性。就像任何其他模型属性一样。
你必须对它调用对象。像这样
#index.html.erb
:
<% @events.each do |event| %> #this line should go inside the index view
<% render partial %>
<% end %>
您不能将@vents
作为参数传递给方法:(event?(@events)
,因为@events
是一个对象数组。因此您需要一个单一实例
另外,我认为您的def event?(other_event)
方法中有一个输入错误。它应该是other_event.id
而不是other_events.id
更新:
@events=events.find(params[:id])
不是数组,因此无法调用数组中的每个方法。这是单个事件。要遵循约定并避免混淆,请将@events
重命名为@event
@event = Events.find(params[:id])
然后在视图中执行以下操作:
<div id="attend_form">
<% if @event.event?(@event) %>
<%= render 'unattend' %>
<% else %>
<%= render 'attend' %>
<% end %>
</div>
部分是由index.html.erb
文件呈现的吗?谢谢您的帮助。我尝试了您的解决方案,但是我得到了错误(未定义的方法
每个'`)@events
从何而来?在控制器中?显示或索引
操作?在控制器索引中发布@events
的定义。@events=events.all
因此上述代码来自部分
,部分由索引.html.erb
呈现。右?移动对象大致如上所述。让我知道这是否有效。@vents
是一个数组,因此它应该可以调用它上面的每个方法,除非它是nil
,并且你应该在nil:NilClass
上获得每个未定义的方法。过了一段时间,我发现我应该将我的模型事件命名为Events,而不是Events,但我认为我可以想办法。我想我只需要创建另一个模型并更改所有内容。我尝试了您的解决方案,但出现了错误未定义的方法“Attenting?”
,可能与模型名称有关。无论如何,谢谢您的帮助
<% @events.each do |event| %> #this line should go inside the index view
<% render partial %>
<% end %>
<div id="attend_form">
<% if event.event?(event) %>
<%= render 'unattend' %>
<% else %>
<%= render 'attend' %>
<% end %>
</div>
@event = Events.find(params[:id])
<div id="attend_form">
<% if @event.event?(@event) %>
<%= render 'unattend' %>
<% else %>
<%= render 'attend' %>
<% end %>
</div>