现在,在以下应用程序中,您创建一个事件,然后转发进入学生编号页面(另一个模型)。
我希望能够创建和事件,然后能够将学号添加到该事件中,而无需选择该事件。
学生和事件控制器没有任何不同。我使用了scaffold命令生成的内容。
这是事件模型:
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 %>
现在,当我创建一个活动时,我将它转发给学生页面,创建的活动显示为下拉列表。因此,要创建学生,我必须选择该事件,然后点击提交。
我希望始终在该事件中选择创建的事件和事件学生编号。我怎么能做到这一点?
答案 0 :(得分: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
答案 1 :(得分: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 %>
希望它会有所帮助。感谢