繁体   English   中英

RoR错误的参数数量(0表示1)形式

[英]RoR wrong number of arguments (0 for 1) form

嗨,我正在尝试创建一个表单,同时创建一个列表并将产品与之关联。

问题在于表格不断提高

参数数量错误(0代表1)

提取的来源(第10行附近):

     7:     <%= f.text_area :description, placeholder:
     8:     "Compose a description for it ..." %>
     9: </div>
     10: <%= l.fields_for :products do |builder| %>
     11: <%= render 'shared/product_form', :l => builder %>
     12: <% end %>
     13: <%= l.submit "Create", class: "btn btn-large btn-primary" %>

应用程序跟踪为

    app/views/shared/_list_form.html.erb:10:in `block in        _app_views_shared__list_form_html_erb__184644094_33330696'
    app/views/shared/_list_form.html.erb:1:in `_app_views_shared__list_form_html_erb__184644094_33330696'
    app/views/lists/new.html.erb:7:in `_app_views_lists_new_html_erb__973495114_33282228'

代码如下:

- -视图 - -

--list_form--

    <%= form_for(@list) do |f| %>
        <%= render 'shared/error_messages', object: f.object %>
        <div class="field">
    <%= f.text_field :name, placeholder:
              "Come up with a name for your list" %>

    <%= f.text_area :description, placeholder:
              "Compose a description for it ..." %>
        </div>
        <%= f.fields_for :products do |builder| %>
        <%= render 'shared/product_form', :f => builder %>
        <% end %>
        <%= f.submit "Create", class: "btn btn-large btn-primary" %>
        <% end %>

--product_form--

     <%= f.text_field :name, "Name:" %>
     <%= f.text_area :description, :rows => 3 %>

- -模型 - -

-列表-

      class List < ActiveRecord::Base
         attr_accessible :description, :name
         belongs_to :user
         has_many :products, :dependent => :destroy
         accepts_nested_attributes_for :products,  :reject_if => lambda { |a|                                 a[:name].blank? }, :allow_destroy => true

         has_many :list_categorization
         has_many :category, :through => :list_categorization

         validates :user_id, presence: true
         validates :name, presence: true, length: {maximum: 10}
         validates :description, length: {maximum: 140}

         default_scope order: 'lists.created_at DESC'

         def categorize!(category_id)
             list_categorization.create!(category_id: category_id)
         end
      end

- 产品 -

    class Product < ActiveRecord::Base
         attr_accessible :description, :donated, :name
         validates :list_id, presence: true
         belongs_to :list
    end

---控制器--- --list_controller--

   def new
       @list = List.new
       @products = @list.products.build
   end

   def create
       @list = current_user.lists.build(params[:list]) if signed_in?
       if @list.save
       flash[:success] ="List " + @list.name + "created!" 
       render 'new'
   end

--product_controller--

  def new
      @product = Product.new
  end

  def create
      @product = @product.build(params[:product]) if signed_in?
      if @product.save
      flash[:success] ="Product " + @product.name + "created!" 
  end

您是对的,我实际上是在发布此信息后才意识到的,但是现在在尝试提交表单时会发生这种情况:

该表格包含1个错误。 *名称不能为空

如果很难,我会​​正确地填充它,这就是通过的原因

---!ruby / hash:ActiveSupport :: HashWithIndifferentAccess utf8:✓authenticity_token:38CXjVORlj2RBgoTetIMoHomcVgOIlBU5rW3NTgkRkU = list:!ruby / hash:ActiveSupport :: HashWithIndifferentAccess名称:列表描述/由: '0':!ruby / hash:ActiveSupport :: HashWithIndifferentAccess名称:p1说明:这是产品提交:创建操作:创建控制器:列表

l从哪里来的? 我很确定您需要将其更改为f

<%= form_for(@list) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <div class="field">
    <%= f.text_field :name, placeholder: "Come up with a name for your list" %>
    <%= f.text_area :description, placeholder: "Compose a description for it ..." %>
  </div>
  <%= f.fields_for :products do |builder| %>
    <%= render 'shared/product_form', :l => builder %>
  <% end %>
  <%= f.submit "Create", class: "btn btn-large btn-primary" %>
<% end %>

更新资料

您的代码有一些问题。 首先,如果您@list = current_user.lists.build(params[:list]) if signed_in? 这意味着,如果没有用户登录,则完全不会创建该对象。 进行此类操作的正确方法是在控制器中使用before_filter

其次@product = @product.build(params[:product])将不起作用。 您尚未初始化Product对象,并且尚未将其分配给@product build也用于关联。 您需要将其更改为@product = Product.new(params[:product])

列出控制器:

before_filter :user_signed_in? # add to products controller as well
# if you need this filter only on certain actions then do:
# before_filter :user_signed_in?, only: [:new, :create]

def new
  @list = current_user.lists.build
  @products = @list.products.build
end

def create
  @list = current_user.lists.build(params[:list])
  if @list.save
    flash[:success] = "List " + @list.name + " created!"
    redirect_to lists_path # this part was missing!
  else # this was also missing
    render 'new'
  end # you had an 'if' with no 'end'
end

private

# add the following to Products controller as well, or if you
# use it a lot then place it in your application controller
def user_signed_in?
  unless signed_in?
    flash[:notice] = "You must first sign in"
    redirect_to sign_in_path
  end
end

产品控制器:

def new
  @product = Product.new
end

def create
  @product = Product.new(params[:product]
  if @product.save
    flash[:success] = "Product " + @product.name + " created!"
    redirect_to @product
  else
    render 'new'
  end
end

据我记得,通过嵌套表单保存产品时不会使用products#create操作,lists#create操作将同时用于这两种方法。

要了解有关嵌套表单的更多信息,请查看这些railscasts

更新代码并浏览完这些视频后,如果您仍然遇到错误,我建议创建一个新问题,因为这个问题已经变得冗长而混乱了:)

您忘记这样做:

rails generate migration add_remember_token_to_users

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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