2013-03-20 64 views
0

我有模型User,Event, Rsvp。我希望Rsvp表单出现在我的Event模型的show页面中。用户可以创建许多事件,但我不需要知道哪个用户创建了哪个事件(至少我不这么认为)。用户也可以rsvp到一个事件。我的模型看起来像这样:从另一个控制器的动作调用导轨形式

user.rb

has_many :rsvps 

event.rb

has_many :rsvps 

rsvp.rb

belongs_to :user 
belongs_to :event 

我想我RsvpsController应该是这样的:

class RsvpsController < ApplicationController 
    def new 
    @user = current_user 
    @event = Event.find(params[:id]) 
    @rsvp = Rsvp.new 
    end 
end 

现在在我的show页的Event的我想它可以让Users RSVP到Event侧边栏的形式。我有这样的事情,但这不太对。我特别不知道的是,进入的form_for的第一个参数:

form_for [@user, @event, @rsvp], url: {controller: 'rsvps_controller', action: 'create' } do |f| 

在我的事件/ I show.html.haml尝试呈现这样的RSVP新动作:

=render template: 'rsvps/new' 

但这反而使事件/新的部分

编辑 我想我知道为什么这是渲染渲染事件新的部分。里面Rsvps/new.html.haml我有render 'form'。我的Events文件夹中也有一个_form.html.haml。

EDIT2

rsvps_controller.rb

def create 
    @rsvp = current_user.rsvps.build(params[:rsvp]) 
    if @rsvp.save 
    flash[:success] = "You have RSVPed." 
    redirect_to Event.find(params[:event_id]) 
    else 

    end 
end 

回答

0

,因为你要创建为当前用户的预约,您只应在事件传递给RSVP创建行动。对于表单,请使用

<%= form_for Rsvp.new do |f| %> 
    <%= f.hidden_field :event_id, value: @event.id %> 

这应该使您能够访问当前用户想要rsvp的事件。因此,在您创建Rsvp控制器的操作中,您可以使用以下代码构建预订

def create 
    @rsvp = current_user.rsvps.build params[:rsvp] 

    if @rsvp.save 
    ... 
end 
+0

几乎就在@jvnill。夫妇快速提问。看到我上面的EDIT2。那是否是“正确的”Rails方式重定向回到相同的事件?另外,如果表单没有被正确填写,我会在else和end之间插入什么,我想重新呈现Event的展示模板,并显示一个错误。 – mikeglaz 2013-03-20 17:49:05

+0

没关系,想通了:渲染'events/show'。谢谢您的帮助! – mikeglaz 2013-03-20 18:26:52

相关问题