首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 3-通过控制器显示has-one属于的所有错误。

Rails 3-通过控制器显示has-one属于的所有错误。
EN

Stack Overflow用户
提问于 2012-03-15 10:17:57
回答 4查看 777关注 0票数 1

我开发了RoR应用程序,遇到了一些我无法解决的问题。我有两个模型-用户教师

代码语言:javascript
复制
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,在这个方法中,我对表单有自己的看法。

代码语言:javascript
复制
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

代码语言:javascript
复制
<%= 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 %>

我有两个问题:

( 1)如何显示所有错误(供用户和教师使用)?这有可能吗?

2)当我从admins_new_teacher_path方法重定向到create_teacher时,是否有可能将数据保存在表单中?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-20 12:24:27

我找到了正确的解决办法。为此,我们应该使用accepts_nested_attributes_for。然后,当我们创建模型的时候

代码语言:javascript
复制
user = User.new( params[:user] ) # Using nested attributes in our model
if user.save
   ..
else
   all_errors = user.errors 
end

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

票数 0
EN

Stack Overflow用户

发布于 2012-03-15 12:00:56

在视图页面上,可以使用form.object.errors检查代码

对于表单对象f,在侧窗体中使用f.object.errors作为表单对象生成器,builder.object.errors在窗体的一侧。

并在控制器上执行render :action => :new_teacher

要获得对象,可以将<%=debug(form.object.errors)%>编写为引用

票数 2
EN

Stack Overflow用户

发布于 2012-03-15 10:41:56

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9717719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档