从另一个控制器的动作调用Rails形式

时间:2013-03-20 14:24:13

标签: ruby-on-rails-3 routing

我有模型UserEventRsvp。我想在Rsvp模型的show页面中显示Event表单。用户可以创建许多事件,但我不需要知道哪个用户创建了哪个事件(至少我不认为)。用户还可以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的{​​{1}}页面中,我想在侧边栏中添加一个表单,让Event rsvp到Users。我有类似的东西,但它不太正确。我特别不确定form_for中的第一个参数是什么:

Event

在我的events / show.html.haml中我尝试像这样渲染Rsvp新动作:

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

但是这会渲染一个事件/新的部分

修改 我想我知道为什么这个渲染会渲染一个Event new partial。在Rsvps / new.html.haml里面我有=render template: 'rsvps/new' 。我的Events文件夹中也有一个_form.html.haml。

EDIT2

rsvps_controller.rb

render 'form'

1 个答案:

答案 0 :(得分:0)

由于您要为当前用户创建预留,因此您应该只将事件传递给rsvp create操作。对于表单,请使用

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