Rails: неправильное количество аргументов (1 вместо 0) для .new

У меня есть эта ошибка, когда я пытаюсь создать объект обзора:

ArgumentError in ReviewsController#create

wrong number of arguments (1 for 0)

app/controllers/reviews_controller.rb:17:in `new'
app/controllers/reviews_controller.rb:17:in `create'

Я не понимаю, что я делаю не так? Я могу создавать любые другие объекты, но эти выдают эту ошибку, что бы я ни делал. Я стараюсь не приводить никаких аргументов, но все же считаю, что он есть...

Моя модель Review :

# -*- encoding : utf-8 -*-
class Review < ActiveRecord::Base

  attr_accessible :global_validation_date, :hr_comment, :hr_validate, :hr_validator, :manager_comment, :manager_validate, :manager_validation_date, :manager_validator, :owner_satisfaction, :owner_validate, :owner_validation_date, :send, :user_id

  belongs_to :user
  has_many :review_projects, dependent: :destroy

end

Мой контроллер ReviewsController :

# -*- encoding : utf-8 -*-
class ReviewsController < ApplicationController

  before_filter :authenticate_user!
  before_filter :check_permissions, only: :create

  def index
    @user = User.find(params[:user_id])
    @reviews = @user.reviews
  end

  def create
    @user = User.find(params[:user_id])
    @reviews = @user.reviews
    if @reviews.empty? || check_last_validate

      @review = Review.new   # HERE IS MY ERROR

      if @review.save
        render 'index', notice: "Review successfully created"
      else
        render 'index', notice: "An error occured on saving, please try again"
      end
    else
      render 'index', alert: "You have to validate previous review before create a new one."
    end

    redirect_to user_reviews_path
  end

  private

  def check_permissions
    render_access_forbidden unless current_user == User.find(params[:user_id])
  end

  def check_last_validate
    if [email protected]?
      return (@reviews.last.hr_validate || @reviews.last.manager_validate)
    else
      return false
    end
  end

end

Я прочитал все те же вопросы на SO, но ничего не работает. Я осторожен с опечатками, но я не думаю, что сделал ошибку.

Я попробовал три способа создать свой объект Review :

@review = Review.new
@review.user_id = current_user.id
@review.hr_validator = ((current_user.hr_id.nil?) ? current_user.id : current_user.hr_id )
@review.manager_validator = ((current_user.manager_id.nil?) ? current_user.id : current_user.manager_id )
@review.hr_validate = false
@review.manager_validate = false
@review.owner_validate = false
@review.hr_comment = ""
@review.manager_comment = ""
@review.owner_satisfaction = nil
@review.send = false

@review = Review.new(
  user_id: current_user.id,
  hr_validator: ((current_user.hr_id.nil?) ? current_user.id : current_user.hr_id ),
  manager_validator: ((current_user.manager_id.nil?) ? current_user.id : current_user.manager_id ),
  hr_validate: false,
  manager_validate: false,
  owner_validate: false,
  hr_comment: "",
  manager_comment: "",
  owner_satisfaction: nil,
  send: false )

@user.reviews.create!(
  user_id: current_user.id,
  hr_validator: ((current_user.hr_id.nil?) ? current_user.id : current_user.hr_id ),
  manager_validator: ((current_user.manager_id.nil?) ? current_user.id : current_user.manager_id ),
  hr_validate: false,
  manager_validate: false,
  owner_validate: false,
  hr_comment: "",
  manager_comment: "",
  owner_satisfaction: nil,
  send: false )

Последний дает мне ту же ошибку, за исключением:

wrong number of arguments (2 for 0)

Моя рубиновая версия — 1.9.3, моя версия рельсов — 3.2.13.

Спасибо.

РЕДАКТИРОВАТЬ :

Когда я пытаюсь использовать в своей консоли rails этот код:

current_user = User.first # as you are inside rails console you wont have current_user available to you
@review = Review.new(user_id: current_user.id,
                    hr_validator: ((current_user.hr_id.nil?) ? current_user.id : current_user.hr_id ),
                    manager_validator: ((current_user.manager_id.nil?) ? current_user.id : current_user.manager_id ),
                    hr_validate: false,
                    manager_validate: false,
                    owner_validate: false,
                    hr_comment: "",
                    manager_comment: "",
                    owner_satisfaction: nil,
                    send: false )
@review.save

Я получаю эту ошибку:

ArgumentError: wrong number of arguments (2 for 0)
    from /Users/killian/.rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.2.13/lib/active_record/attribute_methods/read.rb:71:in `__temp__'
    from /Users/killian/.rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.2.13/lib/active_record/attribute_assignment.rb:85:in `block in assign_attributes'
    from /Users/killian/.rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.2.13/lib/active_record/attribute_assignment.rb:78:in `each'
    from /Users/killian/.rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.2.13/lib/active_record/attribute_assignment.rb:78:in `assign_attributes'
    from /Users/killian/.rvm/gems/ruby-1.9.3-p448/gems/activerecord-3.2.13/lib/active_record/base.rb:498:in `initialize'
    from (irb):31:in `new'
    from (irb):31
    from /Users/killian/.rvm/gems/ruby-1.9.3-p448/gems/railties-3.2.13/lib/rails/commands/console.rb:47:in `start'
    from /Users/killian/.rvm/gems/ruby-1.9.3-p448/gems/railties-3.2.13/lib/rails/commands/console.rb:8:in `start'
    from /Users/killian/.rvm/gems/ruby-1.9.3-p448/gems/railties-3.2.13/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

person Kilian    schedule 25.06.2014    source источник
comment
Это вся ваша модель обзора? Возможно, вы переопределяете def initialize в своей модели?   -  person Bart Jedrocha    schedule 25.06.2014
comment
Да это вся моя обзорная модель. И я не переопределяю метод initialize. Я искал везде, если я не переопределял метод new или initialize, но ничего не нашел.   -  person Kilian    schedule 25.06.2014
comment
@Килиан, что ты пытаешься сделать с помощью return (@reviews.last.hr_validate || @reviews.last.manager_validate) в своем методе check_last_validate? и вы не инициализируете свой обзор должным образом, у вас нет ничего в параметрах   -  person Mandeep    schedule 25.06.2014
comment
Я упорядочиваю отзывы пользователей по идентификатору (с has_many :reviews, order: 'id ASC', dependent: :destroy в модели User), чтобы проверить, подтвержден ли последний отзыв или нет. Но я уже пытаюсь выйти из всех условий, и это все равно не работает. Даже когда я пытаюсь использовать простую строку в rails console.   -  person Kilian    schedule 25.06.2014
comment
Ой ? Но я протестировал этот метод, и он возвращает мне одно значение, поэтому я думаю, что он работает правильно. Во всяком случае, я пытаюсь поставить только @review = Review.new, @review.save и redirect_to в def create, чтобы изолировать проблему, и это все еще не работает.   -  person Kilian    schedule 25.06.2014
comment
Это может быть или не быть причиной вашей проблемы, но у меня не было бы столбца с именем send, так как это может конфликтовать с механизмом отправки ruby.   -  person Daiku    schedule 26.06.2014
comment
У @Daiku есть атрибуты send в моем файле structure.sql и в файле attr_accessible. Я думал, что использовал зарезервированное слово, но, видимо, нет. Я также пытаюсь переименовать модель Review и та же проблема. Так что это может исходить от одного из его атрибутов.   -  person Kilian    schedule 26.06.2014


Ответы (2)


Хорошо, я нахожу проблему... Очевидно, ошибка была вызвана атрибутом send. Я действительно удивлен, потому что я проверил все зарезервированные слова в рубине, и «отправить» нигде не появляется.

Так что просто нужно переименовать его, и теперь все работает. В любом случае, спасибо всем за вашу помощь.

person Kilian    schedule 26.06.2014
comment
send встроен в язык ruby. Когда вы вызываете метод для объекта, вы на самом деле sendотправляете ему сообщение с именем вызываемого метода. ruby-doc.org/core-2.1.1/ Object.html#method-i-send - person Daiku; 26.06.2014
comment
send в основном используется в ruby ​​для вызова методов объектов со строками. Например, Cat.send("meow"), если у класса Cat есть метод мяу. Это полезно, когда у вас есть более одного метода ruby ​​и вам нужно вызвать правильный, который определяется изменяющейся строковой переменной, к которой у вас есть доступ. Вместо того, чтобы делать длинный оператор if и else, вы можете интерполировать строковый аргумент в методе отправки. Например, action = "meow" || "eat" || "sleep", тогда вы можете сказать Cat.send("#{action}"), предполагая, что у вас есть эти три метода. - person Saleh Rastani; 21.06.2016

Я предполагаю, что у вас нет никаких проверок в вашей модели обзора как your hr_comment, manager_comment and owner_satisfaction are not initialised, если у вас есть что-то вроде presence: true для этих полей, ваша запись не будет сохранена в базе данных. Попробуйте это в консоли rails:

current_user = User.first # as you are inside rails console you wont have current_user available to you
@review = Review.new(user_id: current_user.id,
                    hr_validator: ((current_user.hr_id.nil?) ? current_user.id : current_user.hr_id ),
                    manager_validator: ((current_user.manager_id.nil?) ? current_user.id : current_user.manager_id ),
                    hr_validate: false,
                    manager_validate: false,
                    owner_validate: false,
                    hr_comment: "",
                    manager_comment: "",
                    owner_satisfaction: nil,
                    send: false )
@review.save
person Mandeep    schedule 25.06.2014
comment
Я пытаюсь это сделать и получаю сообщение об ошибке: ArgumentError: wrong number of arguments (2 for 0), и у меня нет проверки или значения по умолчанию. Я иду редактировать сообщение, чтобы поместить все сообщение об ошибке. - person Kilian; 25.06.2014
comment
@Kilian, хотя это не должно быть, но вместо передачи тернарного оператора вы можете попробовать передать образцы значений в полях hr_validator и manager_validator, а также, если у вас есть user has_many :reviews, вы можете просто сделать current_user.review.new(parameters) и не нужно передавать значение user_id в параметрах, рельсы свяжут его автоматически - person Mandeep; 25.06.2014
comment
Пробую так, все равно не работает... Бессмысленно... (Но спасибо за совет про current_user.review.new(parameters), потому что я думал, что это работает только с .create) - person Kilian; 25.06.2014
comment
@Килиан, это все твоя модель обзора? возможно, вы переопределили новый метод - person Mandeep; 25.06.2014
comment
Да это так. Вот почему я не понимаю эту ошибку, я никогда не пытаюсь переопределить метод new. Точно так же я создаю модель ReviewProject, и у меня нет с этим проблем. - person Kilian; 25.06.2014
comment
Я не понимаю, почему он думает, что я передаю параметр, а я нет. - person Kilian; 25.06.2014