嵌套路线和形式有很多关系

时间:2014-03-07 01:43:55

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

我正在尝试创建一个简单的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)的索引页面中,我想在每个考试的默认“显示”,“编辑”和“销毁”按钮旁边添加“注册”按钮。当用户点击“注册到考试”按钮时,我希望他们看到一个页面,用户可以选择考试语言偏好,然后提交他们的注册。

此外,我希望用户只能注册一次考试。他们应该能够注册许多考试,但每次考试只有一次。

我该怎么做这种结构?当我使用嵌套资源时,我的所有表单都会抛出错误。

1 个答案:

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