附加形式的形式

时间:2014-03-19 01:54:12

标签: ruby-on-rails

在我的应用中,微博简称为"项目"。在每个用户"显示"页面,应该有一个表格来制作一个新的"项目"属于该用户。

我正在制作这样的表格。

提交表单后,下面的控制器操作将触发:

@user = User.find_by(name: params[:name])
@user.items.create(item_params)
redirect_to 'root'

顺便说一下,' item_params'方法是

params.require(:item).permit(:title, :content, :user_id)

我收到关于第二行的错误。错误是

undefined method 'items' for nil:NilClass

我在rails控制台中检查了我是否可以通过首先按名称选择用户来制作新项目

@user = User.find_by(name: "tester1")

然后使用以下语句为其创建一个项目:

@user.items.create(title: "new_item_title", content: "new_item_content")

并按预期创建了新项目。但是我无法解释浏览器错误。


修改

相关表单位于" show_user"。以下是该页面的HTTP请求的日志:

Started GET "/center/show_user?utf8=%E2%9C%93&name=tester&commit=Search" for 12
.0.0.1 at 2014-03-19 11:46:51 -0700
Processing by CenterController#show_user as HTML
  Parameters: {"utf8"=>"√", "name"=>"tester", "commit"=>"Search"}
  ←[1m←[35mUser Load (1.0ms)←[0m  SELECT "users".* FROM "users" WHERE "users"."
ame" = 'tester' LIMIT 1
  Rendered center/show_user.html.erb within layouts/application (2.0ms)
Completed 200 OK in 23ms (Views: 18.7ms | ActiveRecord: 1.0ms)

表单托管在此页面上。以下是提交表单时发送的请求:

Started POST "/center/show_user" for 127.0.0.1 at 2014-03-19 11:47:14 -0700
Processing by CenterController#create_item_owned as HTML
  Parameters: {"utf8"=>"√", "authenticity_token"=>"P6mb63rhTHx6Q17zhfu4WXErG5Pb0
8t0d/L1RppKAl0=", "item"=>{"title"=>"uno", "content"=>"uno1"}, "commit"=>"Save I
tem"}
  ←[1m←[36mUser Load (1.0ms)←[0m  ←[1mSELECT "users".* FROM "users" WHERE "users
"."name" IS NULL LIMIT 1←[0m
Completed 500 Internal Server Error in 4ms

NoMethodError (undefined method `items' for nil:NilClass):
  app/controllers/center_controller.rb:18:in `create_item_owned'

因此,在提交表单时,没有关于用户的信息与参数一起传递。我该如何解决这个问题?

以下是我的相关路线:

get "center/show_user/" => 'center#show_user'

post "center/show_user" => 'center#create_item_owned'

" create_item_owned"行动是在这个问题的开头描述的行动。 " show_user"行动是

@user = User.find_by(name: params[:name]) @new_item = Item.new

我应该如何转发这些参数,使表单创建的新对象自动与数据库中的特定用户相关联(以及自动创建外键)?


我的表单是

<%= form_for :item do |x| %>
    Title:  <%= x.text_field :title  %> <br>    
    Content:    <%= x.text_field :content %> <br>   
    <%= x.submit %>
<% end %>

1 个答案:

答案 0 :(得分:1)

我认为你可能仍然需要通过id而不是名字来查找。该名称可能不会在参数中传递。您应该检查日志以查看正在发送的params。