0

所以现在在下面的应用程序中,你创建一个事件,然后你被转发到输入学生号页面(另一个模型)。

我希望能够创建和事件,然后能够将学生编号添加到该事件,而无需选择事件。

Student 和 Event 控制器没有任何不同。我使用了脚手架命令生成的内容。

这是事件模型:

class Event < ActiveRecord::Base
  has_many :students
end

这是事件的形式:

<%= semantic_form_for @event do |f| %>
  <%= f.inputs do %>
    <%= f.input :name %>
    <%= f.input :description %>
  <% end %>

  <%= f.actions do %>
    <%= f.action :submit, :as => :input %>
  <% end %>
<% end %>

这是学生模型:

class Student < ActiveRecord::Base
  validates :studentnumber, 
    numericality: { only_integer: true },
    length: { is: 8}
  belongs_to :event
end

这是学生的表格:

<%= semantic_form_for @student do |f| %>
  <%= f.inputs do %>  
    <%= f.input :event, :label => "Select Your Event", :include_blank => false %>
    <%= f.input :studentnumber, :label => "Student Number", :input_html => { :autofocus => true} %>
  <% end %>

  <%= f.actions do %>
    <%= f.action :submit, :as => :input %>
  <% end %>
<% end %>

现在,当我创建一个事件时,我将它转发到学生页面,创建的事件显示为下拉列表。因此,要创建一个学生,我必须选择事件,然后点击提交。

我想始终在该事件中选择创建的事件和事件学生编号。我怎样才能做到这一点?

4

2 回答 2

1

您可以在路由配置中使用嵌套资源:

resources :events do
  resources :students
end

这为这样的学生提供了一条新路线:/events/:event_id/students/new. 然后,您可以在创建事件后在事件控制器中重定向到新操作:

def create
  @event = Event.create(params[:event])

  if @event.save
    redirect_to new_event_student_path(@event)
  else
    render :edit
  end
end

在你的学生控制器中,你只需要获取相关的事件。由于所有学生都属于一个事件,因此您可以在前置过滤器中进行。在您的新操作中,您实例化一个新学生并将事件分配给它:

class StudentsController < ApplicationController

  before_filter :fetch_event

  def new
    @student = Student.new(:event => @event)
  end

  private

    def fetch_event
      @event = Event.find(params[:event_id])
    end

end

在学生的新视图中,应自动选择正确的事件,您可以将事件输入字段更改为隐藏。

另一方面,更好的是删除事件输入字段并将表单 URL 更改为嵌套资源的创建路由:event_students_path(@event)

有关 Rails 中路由的更多信息,请参阅http://guides.rubyonrails.org/routing.html#nested-resources

于 2013-07-29T15:23:12.017 回答
0

您甚至不需要以其他形式发送它。您应该在 Rails 中使用接受嵌套属性。

将此添加到您的事件模型中

class Event < ActiveRecord::Base
 has_many :students
 accept_nested_attributes_for :students
end

并在您的事件控制器中执行新操作

def new
 @event = Event.new
 @event.students.build
end

在您的活动创建表格中,包括您的学生表格,如下所示:

<%= semantic_form_for @event do |f| %>
  <%= f.inputs do %>
    <%= f.input :name %>
    <%= f.input :description %>
    <%= f.fields_for :students do |s|
      <%= s.input :studentnumber, :label => "Student Number" %>       
    <% end %>
<% end %>
<%= f.actions do %>
<%= f.action :submit, :as => :input %>
<% end %>
<% end %>

希望它会有所帮助。谢谢

于 2013-07-29T15:31:20.510 回答