【问题标题】:Rails Client side Collection Validation fails - Simple FormRails 客户端集合验证失败 - 简单表单
【发布时间】:2016-06-06 15:02:22
【问题描述】:

我必须构建一个简单的应用程序,允许用户借阅和借阅书籍。简单地说,用户可以创建书籍,他们可以选择另一个用户来借书。

我有三个模型UserBookLoan

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

  has_many :books
  has_many :loans, through: :books
  has_many :borrowings, class_name: "Loan"

  validates :username, uniqueness: true
  validates :username, presence: true
end

class Book < ActiveRecord::Base
  belongs_to :user
  has_many :loans

  validates :title, :author, presence: true
end

class Loan < ActiveRecord::Base
  belongs_to :user
  belongs_to :book

  validates :user, :book, :status, presence: true
end

LoansController 看起来像这样:

class LoansController < ApplicationController
  before_action :find_book, only: [:new, :create]

  def new
    @users = User.all
    @loan = Loan.new
    authorize @loan
  end

  def create
    @loan = Loan.new
    @loan.book = @book
    @loan.user = User.find(loan_params[:user_id])
    @loan.status = "loaned"
    authorize @loan
    if @loan.save
      redirect_to :root
    else
      render :new
    end
  end

  private

  def loan_params
    params.require(:loan).permit(:user_id)
  end

  def find_book
    @book = Book.find(params[:book_id])
  end
end

我的表格如下:

<%= simple_form_for([@book, @loan]) do |f| %>
  <%= f.input :user_id, collection: @users.map { |user| [user.username, user.id] }, prompt: "Select a User" %>
  <%= f.submit %>
<% end %>

如果我在不选择用户的情况下提交表单,并保留“选择用户”提示选项,则表单已提交并且应用程序崩溃,因为它can't find a user with id=

我不知道为什么表单中的用户存在验证不起作用...

【问题讨论】:

    标签: ruby-on-rails validation collections simple-form


    【解决方案1】:

    你将改变你的创建方法

      def create
        @loan = Loan.new
        @loan.book = @book
        @loan.user = User.find_by_id(loan_params[:user_id])
        @loan.status = "loaned"
        authorize @loan
        if @loan.save
          redirect_to :root
        else
          render :new
        end
      end
    

    【讨论】:

    • 我将 User 方法更改为 find_by_id 并且确实进行了模型验证并呈现了 new 视图。为什么它不能与 find 一起使用?此外,通过这样做,我在LoansControllernew 操作中声明的@users 数组在重新呈现表单时为零,我怎样才能设置它?
    • 我设法在渲染前再次调用@users 来设置它:新,一切都很好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    相关资源
    最近更新 更多