在我的应用中,微博简称为"项目"。在每个用户"显示"页面,应该有一个表格来制作一个新的"项目"属于该用户。
我正在制作这样的表格。
提交表单后,下面的控制器操作将触发:
@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 %>
答案 0 :(得分:1)
我认为你可能仍然需要通过id而不是名字来查找。该名称可能不会在参数中传递。您应该检查日志以查看正在发送的params。