2012-03-15 32 views
1

我开发RoR应用程序,我遇到了我无法解决的事情。我有2个模型 - 用户教师Rails 3 - 通过控制器显示拥有一个所有的错误模型

class User < ActiveRecord::Base 
    ... 
    has_one :teacher 
    accepts_nested_attributes_for :teacher 
end 

class Teacher < ActiveRecord::Base 
    ... 
    belongs_to :user 
end 

此外,我有用户和老师填写数据的形式查看。从这个表单提交数据后,在我的控制器的其他方法 - create_teacher。我还有其他方法new_teacher,在这种方法我有我的观点与形式。

class AdminsController < ApplicationController 
    def new_teacher 
    @user = User.new 
    teacher = @user.build_teacher 
    end 

    def create_teacher 
    params[:user][:user_role] = "teacher" 
    user = User.new(params[:user]) 

    if user.valid? 
     user.save 
     teacher = user.build_teacher(params[:user][:teacher_attributes]) 
     if teacher.valid? 
     teacher.save 
     redirect_to admins_users_of_system_path 
     flash[:success] = "Teacher created!" 
     else 
     redirect_to admins_new_teacher_path 
     flash[:error] = teacher.errors.full_messages.to_sentence 
     user.destroy 
     end 
    else 
     redirect_to admins_new_teacher_path 
     flash[:error] = user.errors.full_messages.to_sentence 
    end 
    end 
end 

我的观点new_teacher.html.erb

<%= form_for @user, :url => create_teacher_url, :html => {:class => "form-horizontal"} do |f| %> 
    <%= field_set_tag do %> 
    <%= f.fields_for :teacher do |builder| %> 
     <div class="control-group"> 
     <%= builder.label :teacher_last_name, "Last name", :class => "control-label" %> 
     <div class="controls"> 
      <%= builder.text_field :teacher_last_name %> 
     </div> 
     </div> 

     ... 
    <% end %> 


    <div class="control-group"> 
     <%= f.label :user_login, "Login", :class => "control-label" %> 
     <div class="controls"> 
      <%= f.text_field :user_login, :value => "" %> 
      <%= link_to_function "Generate login", "generate_login()", :class => "btn" %> 
     </div> 
    </div> 
     ... 
    <% end %> 

    <%= f.submit "Create", :class => "btn btn-large btn-success" %> 
<% end %> 

我有2个问题:

1)我该怎么让所有的错误(用于用户和教师)?那可能吗?

2)是可以保持我的数据表格时,我从create_teacher方法重定向到admins_new_teacher_path

+0

如果使用嵌套表单,请添加视图代码。是的,可以显示所有错误。你必须在页面上找到对象错误 – 2012-03-15 10:49:04

+0

我添加了我的视图,请再次检查我的帖子! – ExiRe 2012-03-15 11:03:25

回答

0

我找到合适的解决方案。为此,我们应该使用accept_nested_attributes_for。然后,当我们这样做时,我们创造模型

user = User.new(params[:user]) # Using nested attributes in our model 
if user.save 
    .. 
else 
    all_errors = user.errors 
end 

在这里,我们通过user.errors得到的所有错误。

0
def create_teacher 
    user_errors, teacher_errors, redirect_path = nil, nil, nil 

    params[:user][:user_role] = "teacher" 
    user = User.new(params[:user]) 

    if user.save 
    redirect_path = admins_users_of_system_path 
    flash[:success] = "Teacher created!" 
    else 
    redirect_path = admins_new_teacher_path 
    user_errors = user.errors.full_messages.to_sentence 
    teacher_errors = user.teacher.errors.full_messages.to_sentence if user.teacher 
    end 

    errors_arr = [user_errors, teacher_errors].compact 
    flash[:error] = "Errors for user: \n" + errors_arr.join("\n Errors for teacher") if errors_arr.present? 
    redirect_to redirect_path 
end 
+0

问题是,如果teacher.valid? ... else ... end'只在用户有效并保存时才可用!这意味着你的版本只显示用户的错误... – ExiRe 2012-03-15 10:58:00

+0

我的意思是,你的版本显示用户或老师的错误。 – ExiRe 2012-03-15 11:09:26

+0

我错过了,对不起。不需要使用build_teacher,它会自动建立,因为params [:user]具有teacher_attributes。 user.valid?如果教师有错误,则返回错误“教师无效”。 – gayavat 2012-03-15 11:13:10

2
视图页面上

您可以一边使用form.object.errors 检查代码

对于表单对象f使用f.object.errors在侧形式 表单对象建设者builder.object.errors嵌套形式

,并做了render :action => :new_teacher控制器上

要获取对象,您可以编写<%=debug(form.object.errors)%>作为参考

0

你可以e。 G。验证teacher_last_name领域模型中的:

validate :ensure_teacher_exists 

def ensure_teacher_exists 
    unless Teacher.find_by_teacher_last_name(teacher_last_name) 
    errors.add(:teacher_last_name, "does not exist") 
    end 
end 

然后,你必须在你的视图中添加:

<%= builder.error_message_on :teacher_last_name %> 

这将显示近场的错误消息。

如果遇到“undifined方法”的错误添加下面的方法来配置/初始化/ form_builder.rb

def error_message_on(attr) 
    message = Error.message(object, attr) 
    @template.content_tag(:div, message, :class => 'error_message') if message.present? 
end 
+0

嗯,我试过这个,现在'未定义的方法error_message_on#' – ExiRe 2012-03-15 14:52:20

+0

看看error_message_on是在config/initializers/form_builder.rb中定义的。如果不是,请按上面所示添加它。 – almai 2012-03-15 16:22:19

相关问题