我遇到了构建关联的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')) %>")
答案 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| %>