如何在将数据输入另一个模型时始终选择创建的字段?

时间:2013-07-29 14:50:41

标签: ruby-on-rails ruby-on-rails-4

现在,在以下应用程序中,您创建一个事件,然后转发进入学生编号页面(另一个模型)。

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

学生和事件控制器没有任何不同。我使用了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 %>

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

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

2 个答案:

答案 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 %>

希望它会有所帮助。感谢