Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 部分形式的未定义模型方法_Ruby On Rails - Fatal编程技术网

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>