我正在尝试创建一个简单的Rails4应用程序。我有用户模型,由Devise GEM生成,考试模型和参与模型都是由脚手架生成器生成的。
这些是我的模特:
class Examination < ActiveRecord::Base
has_many :participations
has_many :users, :through => :participations
end
class Participation < ActiveRecord::Base
belongs_to :user
belongs_to :examination
end
class User < ActiveRecord::Base
has_many :participations
has_many :examinations, :through => :participations
end
现在,我想创建一个结构,使用户能够注册考试。在考试(app / views / examinations / index.html.erb)的索引页面中,我想在每个考试的默认“显示”,“编辑”和“销毁”按钮旁边添加“注册”按钮。当用户点击“注册到考试”按钮时,我希望他们看到一个页面,用户可以选择考试语言偏好,然后提交他们的注册。
此外,我希望用户只能注册一次考试。他们应该能够注册许多考试,但每次考试只有一次。
我该怎么做这种结构?当我使用嵌套资源时,我的所有表单都会抛出错误。
答案 0 :(得分:1)
我不明白为什么你需要为表单嵌套资源。考试ID和语言偏好都应该是参与的属性。
因此,您只需构建一个页面,根据考试ID创建新的参与。
参与控制器
# if your route is /participations/new?examination_id=1
# you could also do nested routing like /exams/1/participations/new
def new
@participation = Participation.new
@examination = params[:examination_id]
end
def create
@participation = Participation.new params[:participation]
@participation.user = current_user
if @participation.save
redirect_to examinations_page
else
render 'new'
end
end
然后它只是new.html.erb页面中的一个简单表单..
<h1> Sign up for: <%= @examination.name %> </h1>
<%= form_for @participation do |f| %>
<%= f.hidden :examination_id %>
<%= f.select :language_preference #add the set of language options in here %>
<%= f.submit :register %>
<% end %>
如果您发现您的表单提交错误的路线,那么您可以设置其网址..例如,如果您的参与资源嵌套在考试资源下,那么您的粗略路径将是:
<%= form_for @participation, as: :participation, url: new_examination_participation_path(@examination) } do |f| %>
...
<% end %>