Javascript Rails表单通过使用AJAX进行多个关联无法工作

Javascript Rails表单通过使用AJAX进行多个关联无法工作,javascript,jquery,ruby-on-rails,ajax,Javascript,Jquery,Ruby On Rails,Ajax,我对建立关联的表单有问题。我有一个事件模型、一个用户模型和一个与会者模型。模型的代码如下所示: class User < ActiveRecord::Base has_many :activities, class_name: "Attendee", dependent: :destroy has_many :events, through: :activities class Event < ActiveRecord::Base has_many :att

我对建立关联的表单有问题。我有一个事件模型、一个用户模型和一个与会者模型。模型的代码如下所示:

class User < ActiveRecord::Base
    has_many :activities, class_name: "Attendee", dependent: :destroy
    has_many :events, through: :activities

class Event < ActiveRecord::Base
    has_many :attendees, dependent: :destroy
    has_many :users, through: :attendees

class Attendee < ActiveRecord::Base
    belongs_to :user
    belongs_to :event
def create
    @user_event = Event.find(params[:attendee][:event_id])
    current_user.events.push(@user_event)
    respond_to do |format|
        format.html { redirect_to event_path(@user_event) }
        format.js
    end
end

def destroy
    @user_event = Attendee.find(params[:id])
    current_user.activities.destroy(@user_event)
    respond_to do |format|
        format.html { redirect_to root_path }
        format.js
    end
end
Attenders_控制器中的创建和销毁方法如下所示:

class User < ActiveRecord::Base
    has_many :activities, class_name: "Attendee", dependent: :destroy
    has_many :events, through: :activities

class Event < ActiveRecord::Base
    has_many :attendees, dependent: :destroy
    has_many :users, through: :attendees

class Attendee < ActiveRecord::Base
    belongs_to :user
    belongs_to :event
def create
    @user_event = Event.find(params[:attendee][:event_id])
    current_user.events.push(@user_event)
    respond_to do |format|
        format.html { redirect_to event_path(@user_event) }
        format.js
    end
end

def destroy
    @user_event = Attendee.find(params[:id])
    current_user.activities.destroy(@user_event)
    respond_to do |format|
        format.html { redirect_to root_path }
        format.js
    end
end
问题是,当我单击“加入事件”按钮时,不会发生任何事件。Chrome开发工具中“网络”选项卡下显示的错误是:

undefined method `id' for nil:NilClass
Extracted source (around line #1):
    <%= form_for(current_user.activities.find_by(event_id: @event.id), html: { method: :delete }, remote: true) do |f| %>
        <%= f.submit "Leave event" %>
    <% end %>
undefined method `id' for nil:NilClass
Extracted source (around line #1):
    <%= form_for(current_user.activities.build(event_id: @event.id), remote: true) do |f| %>
        <%= f.hidden_field :event_id %>
        <%= f.submit "Join event" %>
    <% end %>
nil:NilClass的未定义方法'id' 提取的源(第1行附近): 突出显示的行是具有“当前用户.activities.find_by(event_id:@event.id)”的第一行。当我检查数据库时(我使用的是PostgreSQL),关联已经创建,如果我点击刷新按钮,将呈现leave_事件部分。所以问题似乎是,使用AJAX我无法访问事件显示页面的id。当我尝试单击“离开事件”按钮时,同样的问题也出现了。什么都没有发生,Chrome开发工具中“网络”选项卡下显示的错误显示:

undefined method `id' for nil:NilClass
Extracted source (around line #1):
    <%= form_for(current_user.activities.find_by(event_id: @event.id), html: { method: :delete }, remote: true) do |f| %>
        <%= f.submit "Leave event" %>
    <% end %>
undefined method `id' for nil:NilClass
Extracted source (around line #1):
    <%= form_for(current_user.activities.build(event_id: @event.id), remote: true) do |f| %>
        <%= f.hidden_field :event_id %>
        <%= f.submit "Join event" %>
    <% end %>
nil:NilClass的未定义方法'id' 提取的源(第1行附近): 关联已销毁,但“加入事件”按钮未呈现,因为的表单_似乎无法从url访问id(在这种特定情况下,url为localhost:3000/events/34)

所以我的问题是,如何获取表单_以访问url中的事件id?只要我点击浏览器上的刷新按钮,就会创建关联并呈现正确的表单,但我无法使用AJAX使其正常工作

为了以防万一,create.js.erb和destroy.js.erb文件(位于“视图/与会者”中)包括:

$(“加入活动”).html(“”)
$(“#加入#U活动”).html(“”)

我认为问题在于您正在从分部调用
@event
,而此时您应该使用:


#app/views/controller/_join_event.html.erb

@event
为零。此实例值应在控制器中创建,不应从url获取。您可以先在没有
remote:true
的情况下调试它,然后再将其添加回。在事件控制器的show方法中,
@event
的形式不是用于引用
@event
的吗?我从url获取id的意思是引用传递给
Event.find()
params[:id]
。参数散列中的id不是来自url吗?当我第一次加载页面时,
@event
不是nil,因此我不明白为什么在单击“加入事件”按钮后它会变成nil。此外,它在没有
远程:true
的情况下工作。直到我添加了AJAX,我才发现它有问题。rails是什么样子的?单击“加入事件”按钮后,它将调用创建操作,但不会再次调用显示操作。所以它将是零。在create方法中将
@user\u事件
更改为
@event
怎么样?我在create方法中将
@user\u事件
更改为
@event
,这使它工作起来。对于destroy方法,我必须添加一个实例变量来获取事件id--
@event=event.find(@user\u event.event\u id)
。谢谢你的帮助!我在原始帖子下的评论中详细说明了它的工作原理。我试着按照你的建议去做,看看它是否也能正常工作,但我得到了与我最初得到的相同的错误:nil类的未定义方法“id”。有没有办法在js.erb文件中使用局部变量?因为渲染调用来自那些可能工作的文件。
$("#join_event").html("<%= escape_javascript(render('events/leave_event')) %>")

$("#join_event").html("<%= escape_javascript(render('events/join_event')) %>")
<%= render partial: "join_event", locals: { event: @event } %>

#app/views/controller/_join_event.html.erb
<%= form_for(current_user.activities.build(event_id: event.id), remote: true) do |f| %>