【问题标题】:Nested form validation rails 3.2嵌套表单验证 rails 3.2
【发布时间】:2014-10-19 14:40:55
【问题描述】:

我在同一个视图中有一个工作和用户(设计)表单。当我尝试在用户字段中提交错误时,它会给我一个带有验证消息的异常页面。在工作字段中提交错误可以正常工作!

job_controller.rb
def new
  @job = Job.new
  if !current_user
    @job.user = User.new
  end

  respond_to do |format|
    format.html # new.html.erb
  end
end

  def create
    @types = Type.all
    @categories = Category.all

    @job = Job.new(params[:job])
    #if not logged in creates a user and sign in
    if !current_user
      @user = User.new(params[:job][:user_attributes])
    else
      @user = current_user
    end

    @job.user_id = @user.id

    respond_to do |format|
      if @job.save
        if !current_user
          sign_in(:user, @user)
        end
        format.html { redirect_to @job }
      else
        format.html { render action: "new" }
      end
    end
  end

  job.rb
  attr_accessible :user_attributes, :description, :name ....
  belongs_to :user
  accepts_nested_attributes_for :user

谢谢!

【问题讨论】:

  • 你能显示作业模型吗?用户和作业类之间的关系是什么
  • 更新了我的问题!谢谢
  • 哪一行发生了异常?当您说“提交时用户字段中有错误”时,您期望什么结果?
  • 我希望通过错误消息重定向回新控制器

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord devise


【解决方案1】:

因为您正在调用 @user.save!,这将产生异常。这样做也不会将作业与用户放在同一事务中。你要的是nested_attributes:

class Job < ActiveRecord::Base

   accepts_nested_attributes_for :user

end

如果用户已登录,请不要显示表单的该部分并过滤这些参数。

http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.htmlhttp://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html处查看更多 Rails 文档

编辑:

简化您的控制器代码,因为您使用的是嵌套属性,您不再需要手动创建用户。

#if not logged in creates a user and sign in
if !current_user
  @user = User.new(params[:job][:user_attributes]) # this is no longer needed
else
  @user = current_user
end

@job.user_id = @user.id # this is redundant

类似于:

# if logged in, manually assign the user (also you may want to reject any user attributes)
@job.user = current_user if current_user

【讨论】:

  • 出于某种原因,当我删除了@user.save!一切都按预期工作(好)。记录已正确保存,但我被重定向回新视图,并出现错误提示“电子邮件已被占用”。
  • @MathRivest 此时您的控制器代码是什么样的?有什么重大变化吗?听起来您是从属性创建一个新用户,而不是分配登录用户。
  • 我现在收到一个异常提示“列电子邮件不是唯一的:INSERT INTO "users" ...”
  • @MathRivest 在编辑中澄清了您当前的问题。希望有效!
  • 哇,谢谢,这比我第一次做的要简单得多!一直在这个问题上几个小时。快速提问,如果我不使用用户属性,为什么要拒​​绝它们?这是好的做法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多