我的rails应用程序上有两个表单,要求用户输入代码以确认它们属于学校,而另一个表单则是教室的代码。每次用户输入或离开代码为空时,我都会收到以下错误消息:
First argument in form cannot contain nil or be empty
它总是在控制器的create方法中,所以我必须没有正确的语法。
以下是发生错误的两个控制器。
注册控制器
class RegistrationsController < Devise::RegistrationsController
skip_before_filter :verify_authenticity_token, :only => :create
def update
super
end
def new
super
end
def create
code = params[:user][:code]
@school = School.where(:code => code).first
unless @school
flash[:error] = "School code not valid"
render :new
end
params[:user][:school_id] = @school.id
super
end
学校管理员
def create_teacher
authorize @school
params[:user][:school_id] = @school.id
params[:user][:role] = "teacher"
@teacher = User.create(teacher_params)
if @teacher.id.nil?
flash[:error] = @teacher.errors.full_messages
render :new_teacher
else
respond_with @school
end
end
如何更正此问题,以便呈现Flash错误消息?
编辑屏幕拍摄实际错误。注意,它们都在create方法中,所以我认为它是一个相同的问题。
编辑:将用户添加到学校的注册表。
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">
<h1>Sign up</h1>
</div>
<div class="panel-body">
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<div class="form-group">
<%= f.label :name %>
<%= f.text_field :name, autofocus: true, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :email %>
<%= f.email_field :email, autofocus: true, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :school_code %>
<%# f.text_field :code, class: "form-control" %>
<input type="text" id="code" name="user[code]" value>
</div>
<div class="form-group">
<%= f.label :password %>
<%= f.password_field :password, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :password_confirmation, "Confirm Password" %>
<%= f.password_field :password_confirmation, class: "form-control" %>
</div>
<strong>Student</strong> <%= f.radio_button(:role, "user") %>
<div class="form-group">
<%= f.submit "Sign up", class: "btn btn-lg btn-primary" %>
</div>
<% end %>
</div>
<div class="panel-footer">
<%= render "devise/shared/links" %>
</div>
答案 0 :(得分:1)
我认为问题在于你的<%= form_for .. %>
如果我输入一个无效的参数,我会得到同样的错误。对于学校,请尝试<%= form_for @school %>
并确保您的控制器中的新方法(无论哪个人正在使用表单呈现页面)正在创建对象的新实例,
def new
@school = School.new
end
与引脚相同
这样的东西可能就是你要找的东西
before_action :check_code, only: :create
...
def check_code
unless School.find_by school_code params[:school_code]
flash[:error] = "Invalid school code"
redirect_to new_reg_path
end
end
并显示Flash消息
<% flash.each do |message_type, message| %>
<div class="alert alert-<%= message_type %>">
<%= message %>
</div>
<% end %>