Rails form_for has_many通过关联使用AJAX无法正常工作

时间:2014-05-03 02:18:01

标签: javascript jquery ruby-on-rails ajax

我遇到了构建关联的form_for问题。我有一个事件模型,一个用户模型和一个参加者模型。模型的代码如下:

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

在活动的展示页面上,我有一个加入活动的按钮,用于创建用户和活动之间的关联。

<div id="join_event">
    <% if current_user.events.include?(@event) %>
        <%= render 'leave_event' %>
    <% else %>
        <%= render 'join_event' %>
    <% end %>
</div>

join_event和leave_event部分是:

join_event:

<%= form_for(current_user.activities.build(event_id: @event.id), remote: true) do |f| %>
    <%= f.hidden_field :event_id %>
    <%= f.submit "Join event" %>
<% end %>

leave_event:

<%= form_for(current_user.activities.find_by(event_id: @event.id), html: { method: :delete }, remote: true) do |f| %>
    <%= f.submit "Leave event" %>
<% end %>

上面部分内容中的@event位于events_controller中的show方法:

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

attendees_controller中的create和destroy方法如下:

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

问题在于,当我点击&#34;加入活动&#34;按钮注意发生。 “网络”下的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 %>

突出显示的行是&#34; current_user.activities.find_by(event_id:@ event.id)&#34;的第一行。当我检查数据库时(我使用PostgreSQL)已经创建了关联,如果我点击刷新按钮,则会渲染leave_event部分。所以问题似乎是使用AJAX我无法访问事件显示页面的id。当我尝试点击&#34;离开事件&#34;同样的问题出现了。按钮。没有任何反应,并且“网络”下的Chrome开发工具中出现错误。标签说:

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 %>

该协会已被销毁,但&#34;加入活动&#34;按钮没有呈现,因为form_for似乎无法从URL访问id(在这种特殊情况下,url是localhost:3000 / events / 34)

所以我的问题是,如何让form_for访问url中的事件ID?只要我点击浏览器上的刷新按钮,就会创建关联并显示正确的表单,但是我无法使用AJAX将其工作。

万一需要,create.js.erb和destroy.js.erb文件(位于&#39; views / attendees&#39;)是:

$("#join_event").html("<%= escape_javascript(render('events/leave_event')) %>")

$("#join_event").html("<%= escape_javascript(render('events/join_event')) %>")

1 个答案:

答案 0 :(得分:0)

我认为问题是,当你应该使用locals时,你是从部分调用@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| %>