[英]RoR wrong number of arguments (0 for 1) form
Hi I'm trying to create a form, that at the same time, creates a list and associates products to it. 嗨,我正在尝试创建一个表单,同时创建一个列表并将产品与之关联。
The problem is that the form keeps raising 问题在于表格不断提高
wrong number of arguments (0 for 1) 参数数量错误(0代表1)
Extracted source (around line #10): 提取的来源(第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 Trace is 应用程序跟踪为
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'
The code is as follows: 代码如下:
---view---- - -视图 - -
--list_form-- --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-- --product_form--
<%= f.text_field :name, "Name:" %>
<%= f.text_area :description, :rows => 3 %>
---model--- - -模型 - -
--list-- -列表-
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
--product-- - 产品 -
class Product < ActiveRecord::Base
attr_accessible :description, :donated, :name
validates :list_id, presence: true
belongs_to :list
end
---controllers--- --list_controller-- ---控制器--- --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-- --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
You were right, I actually realized it after posting this, but now while trying to submit the form this happens: 您是对的,我实际上是在发布此信息后才意识到的,但是现在在尝试提交表单时会发生这种情况:
The form contains 1 error. 该表格包含1个错误。 * Name can't be blank
*名称不能为空
event tough I filled it correctly, this is what is getting passed 如果很难,我会正确地填充它,这就是通过的原因
--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess utf8: ✓ authenticity_token: 38CXjVORlj2RBgoTetIMoHomcVgOIlBU5rW3NTgkRkU= list: !ruby/hash:ActiveSupport::HashWithIndifferentAccess name: list description: this is a list products_attributes: !ruby/hash:ActiveSupport::HashWithIndifferentAccess '0': !ruby/hash:ActiveSupport::HashWithIndifferentAccess name: p1 description: this is a product commit: Create action: create controller: lists ---!ruby / hash:ActiveSupport :: HashWithIndifferentAccess utf8:✓authenticity_token:38CXjVORlj2RBgoTetIMoHomcVgOIlBU5rW3NTgkRkU = list:!ruby / hash:ActiveSupport :: HashWithIndifferentAccess名称:列表描述/由: '0':!ruby / hash:ActiveSupport :: HashWithIndifferentAccess名称:p1说明:这是产品提交:创建操作:创建控制器:列表
Where did that l
come from? l
从哪里来的? I'm pretty sure you need to change it to f
: 我很确定您需要将其更改为
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 %>
There are a few problems with your code. 您的代码有一些问题。 First of all when you call
@list = current_user.lists.build(params[:list]) if signed_in?
首先,如果您
@list = current_user.lists.build(params[:list]) if signed_in?
it means that if there is no user signed in that object won't be created at all. 这意味着,如果没有用户登录,则完全不会创建该对象。 The proper way to do something like this would be with a
before_filter
in your controller. 进行此类操作的正确方法是在控制器中使用
before_filter
。
Secondly @product = @product.build(params[:product])
won't work. 其次
@product = @product.build(params[:product])
将不起作用。 You haven't initialized a Product
object yet, and you haven't assigned it to @product
yet. 您尚未初始化
Product
对象,并且尚未将其分配给@product
。 Also build
is used for associations. build
也用于关联。 You need to change this to @product = Product.new(params[:product])
. 您需要将其更改为
@product = Product.new(params[:product])
。
Lists controller: 列出控制器:
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
Products controller: 产品控制器:
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
As far as I remember however, the products#create
action won't be used when saving a product through a nested form, the lists#create action will be used for both. 据我记得,通过嵌套表单保存产品时不会使用
products#create
操作,lists#create操作将同时用于这两种方法。
To learn more about nested forms have a look at these railscasts . 要了解有关嵌套表单的更多信息,请查看这些railscasts 。
Once you've updated your code and gone through those videos, if you're still getting errors I would recommend to create a new question since this one is getting long and messy already :) 更新代码并浏览完这些视频后,如果您仍然遇到错误,我建议创建一个新问题,因为这个问题已经变得冗长而混乱了:)
您忘记这样做:
rails generate migration add_remember_token_to_users
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.