简体   繁体   中英

Ruby on Rails error when validates_uniqueness_of using collection_select

First, sorry for my bad English. I'm still learning.

I have 3 tables in my DB:

Problem

  • has_many :registers
  • has_many :solutions, through : :registers

Solution

  • has_many :problems
  • has_many :problems, through : :registers

Register

  • belongs_to: problem
  • belongs_to :solution

The system is working well. I am able to insert new data in all of the 3 tables.

In the views for the table/model Register , to select problems and solutions, I make use of collection_select, like this:

   = form_for @register do |f|

  .field
    = f.label :problem_id
    = collection_select( :register, :problem_id, @problems, :id, :name, {}, { :multiple => false })
  .field
    = f.label :solution_id
    = collection_select( :register, :solution_id, @courses, :id, :name, {}, { :multiple => false })
  .field
    = f.label :entry_at
    = f.datetime_select :entry_at
  .actions = f.submit

The problem only appears when I try to add this validation to Register :

validates_uniqueness_of :student_id , scope: :course_id

Then I get:

> undefined method `map' for nil:NilClass 
> = collection_select( :register, :problem_id, @problems, :id, :name, {}, { :multiple => false })

And I dont know why.

So, I tried to do the validation by the controller:

def create
  @register = Register.new(register_params)
  problem_id = @register.problem_id 
  solution_id = @register.solution_id
  if Register.exists?(['problem_id LIKE ? AND solution_id LIKE ?', problem_id, solution_id ])
    render 'new'
  else
    @register.save
    respond_with(@register)
  end
end

But the error remains.

I believe that the cause is the collection_select, but I don't know how to solve it.

Saying one more time, I am able to persist date in all the 3 DB tables. But when I try to avoid duplication, the error appears.

This is how I solve this problem:

def create
        @register = register.new(register_params)

        #if @register.save
        #  respond_with(@register)
        #else
        #  @register = register.all
        #  render :new
        #end
        problem_id = @register.problem_id 
        solution_id = @register.solution_id

        if register.exists?(['problem_id LIKE ? AND solution_id LIKE ?', problem_id, solution_id ])
          @register = register.new
          @solutions = Solution.all
          @problems = Problem.all
          flash[:error] = "Problem alread in the register for this solution"
          render 'new'
        else
          @register.save
          respond_with(@register)
        end 

      end

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM