ArgumentError, неправильное количество аргументов

я получаю сообщение об ошибке

ArgumentError in PagesController#home, wrong number of arguments (0 for 1)

но я не знаю почему. У меня есть модель Users от Devise и модель Dplan, где dplan belongs_to :user и пользователь has_many :dplans. Я пытаюсь настроить свой сайт так, чтобы вы могли создать новый dplan на главной странице. Моя домашняя страница выглядит так:

<% if user_signed_in? %>
<h1>Hello <%= current_user.name %>! <h1>

<%= form_for @dplan do |f|%>
    <div class="field">
        <%= f.text_area :name %>
    </div>
    <div class="actions">
        <%= f.submit "Submit" %>
    </div>
<% end %>

<% else %>
<h1>DPlanner</h1>
<p>
    This is the home page for DPlanner.
</p>

<%= link_to "Sign up now!", new_user_registration_path, :class =>   "signup_button round" %>
<% end %>

Это dplans_controller.rb:

class DplansController < ApplicationController

  def create
      @dplan = current_user.dplans.build(params[:dplan])
      if @dplan.save
          flash[:success]="Dplan created!"
          redirect_to root_path
      else
          render 'pages/home'
      end 
  end 

  def destroy
  end 

end

А вот и pages_controller.rb:

class PagesController < ApplicationController

    def home
        @title = "Home"
        @dplan = Dplan.new if user_signed_in?
    end

end

Я не понимаю, почему я получаю это сообщение об ошибке - единственный аргумент, необходимый на странице, - это dplan, который я определяю в контроллере страниц. Помощь!

Вот dplan.rb:

class Dplan < ActiveRecord::Base
    attr_accessible :name

    belongs_to :user

    validates :name, :presence=>true, :length => { maximum => 30 }
    validates :user_id, :presence =>true

end

person steffi2392    schedule 17.08.2011    source источник
comment
Похоже, что конструктор для Dplan принимает аргумент. Можете ли вы включить класс Dplan.   -  person Rob Di Marco    schedule 17.08.2011
comment
Если я закомментирую строку 2 validates, я получу сообщение об ошибке NoMethodError in Pages#home, undefined method dplans_path' for #‹#‹Class:0x00000101c45f20›:0x00000101c42320›` Похоже, проблема с @dplan в строке form_for @dplan do... в домашнем представлении. Что-то не так со строкой @dplan=Dplan.new в pages_controller?   -  person steffi2392    schedule 17.08.2011
comment
Я думаю, что проблема в #home заключается в том, что @dplan определяется только в том случае, если пользователь вошел в систему. Что произойдет, если пользователь этого не сделает?   -  person corroded    schedule 17.08.2011


Ответы (3)


У меня была похожая проблема при использовании Devise + Omniauth, и симптомы включали:

  1. не было никакой трассировки приложения
  2. это не исчезнет, ​​даже если мой метод контроллера будет пустым.
  3. другие контроллеры работали нормально

это оказалось своего рода конфликтом имен, который исчез, когда я переименовал свой метод и контроллер. Например:

Invites#process Ошибка (1 вместо 0)
Invitations#process --> Ошибка (1 вместо 0)
Friends#Add --> Нет ошибки!

Надеюсь это поможет.

person Aditya    schedule 18.08.2011
comment
Большое спасибо за это! Исправлена ​​моя проблема. - person ubermensch; 19.11.2011
comment
Спасибо, я также использовал процесс зарезервированного ключевого слова и столкнулся с этой проблемой. - person Maanas Royy; 03.02.2015

Попробуйте заменить user_signed_in? на current_user. Или попробуйте добавить before_filter :authenticate_user! в application_controller.rb, чтобы избежать оператора if в вашем контроллере.

person Sergey Kishenin    schedule 17.08.2011
comment
Этот ответ неверен. Ошибка возникает в PagesController#home, а не в DplansController#create. - person Mischa; 17.08.2011
comment
Kishie, спасибо за ответ, но это не сработало. Миша прав, ошибка в PagesController#home, но я не знаю, что это такое. - person steffi2392; 17.08.2011
comment
Догадаться! Мне не хватало resources :dplans в routes.rb. Спасибо за вашу помощь! - person steffi2392; 17.08.2011

Я на самом деле понял это, мне не хватало resources :dplans в route.rb. Спасибо за вашу помощь!

person steffi2392    schedule 18.08.2011