我有一个表单允许用户在一组Show方法中发布。发布后,我想重定向到显示新帖子的同一页面。我正在使用以下内容,但我收到以下错误。我不确定为什么@group是nil,因为我已经在我的组控制器的节目中定义了它。
没有路由匹配{:id => nil}缺少必需的密钥:[:id] 对于 redirect_to group_path(@group)
<%=form_for([@post]) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<div class = "field">
<%= f.label :event_name %>
<%= f.collection_select(:event_id, @events, :id, :title) %>
</div>
<div class = "field">
<%= f.text_area :comment, placeholder: "New Post..." %>
</div>
<%= f.hidden_field :user_id, value: current_user.id %>
<%=f.submit "Submit", class: "btn btn-large btn-primary" %>
<%end%>
class PostsController < ApplicationController
def create
if @post = Post.create(post_params)
flash[:success] = "Post Created!"
redirect_to group_path(@group)
else
redirect_to group_url
flash[:alert] = "Sorry - Post not created."
end
end
end
def show
@event = @group.events.build
@post = Post.new
@events = @group.events.includes(:posts)
@group = Group.find(params[:id])
end
答案 0 :(得分:2)
在@group
操作中设置create
。您尚未为@group
分配任何值,这就是您收到错误的原因。
修改强>
根据您的评论A Group has_many events
,您可以按以下方式找到该群组:
@group = Event.find(params[:event_id]).group
答案 1 :(得分:2)
在您的创建操作中,您尝试使用@group实例变量。您尚未在创建操作中对其进行定义,因此如果您想使用它,则需要在那里创建它。由于对create的调用是在一个单独的请求周期中,因此您在show动作中定义的实例变量不可用。
更新: 要获得该组,如果您有event_id和事件belongs_to:group,您可以:
event = Event.find(event_id)
@group = event.group