我正在建立一个facebook克隆,我正试图在每个用户的页面上有一个文本区域,以允许他们发帖。我尝试了很多不同的事情但没有成功,但是现在我在尝试访问用户的显示页面时遇到了这个错误:
First argument in form cannot contain nil or be empty
使用此代码:
Rails.application.routes.draw do
resources :friends, only: [:index, :destroy]
resources :posts
resources :friend_requests
devise_for :users
devise_scope :user do
root 'devise/sessions#new'
end
resources :users, only: [:index, :show] do
resources :posts
end
get 'about', to: 'static_pages#about'
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
_post_form.html.erb
<%= form_for [@user, @post] do |f| %>
<%= f.text_area :content, size: "60x12", placeholder: "What do you want to say?" %>
<%= f.submit "Post" %>
<% end %>
class PostsController < ApplicationController
def index
@posts = Post.all
end
def new
@post = Post.new
@user = User.find(params[:user_id])
end
def create
@post = current_user.posts.build(post_params)
if @post.save
flash[:success] = "Posted!"
redirect_to user_path(current_user)
else
flash[:notice] = "Post could not be submitted"
redirect_to users_path
end
end
private
def post_params
params.require(:post).permit(:content)
end
end
class UsersController < ApplicationController
def index
@users = User.all
end
def show
@user = User.find(params[:id])
end
end
users/show.html.erb
<h4>You are signed in as <%= current_user.email %>! </h4>
<% if @user == current_user %>
<%= render "notifications" %>
<%= render 'shared/post_form' %>
<% end %>
<%= params.inspect %>
<%= current_user.id %>
server log:
Processing by UsersController#show as HTML
Parameters: {"id"=>"4"}
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2 [["id", 4], ["LIMIT", 1]]
User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 4], ["LIMIT", 1]]
Rendering users/show.html.erb within layouts/application
FriendRequest Load (0.5ms) SELECT "friend_requests".* FROM "friend_requests" WHERE "friend_requests"."friend_id" = $1 ORDER BY "friend_requests"."id" ASC LIMIT $2 [["friend_id", 4], ["LIMIT", 1000]]
Rendered users/_notifications.html.erb (2.0ms)
Rendered shared/_post_form.html.erb (3.0ms)
Rendered users/show.html.erb within layouts/application (10.2ms)
Completed 500 Internal Server Error in 23ms (ActiveRecord: 1.3ms)
ActionView::Template::Error (First argument in form cannot contain nil or be empty):
1: <%= form_for [@user, @post] do |f| %>
2: <%= f.text_area :content, size: "60x12", placeholder: "What do you want to say?" %>
3: <%= f.submit "Post" %>
4: <% end %>
app/views/shared/_post_form.html.erb:1:in `_app_views_shared__post_form_html_erb___99030300856795657_70237723952000'
app/views/users/show.html.erb:5:in `_app_views_users_show_html_erb___3196827877852207953_70237724137160'
Rendering /usr/local/lib/ruby/gems/2.3.0/gems/actionpack- 5.0.0.1/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb within rescues/layout
Rendering /usr/local/lib/ruby/gems/2.3.0/gems/actionpack- 5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_source.html.erb
呈现/usr/local/lib/ruby/gems/2.3.0/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_source.html.erb(6.7ms) 渲染/usr/local/lib/ruby/gems/2.3.0/gems/actionpack- 5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb 呈现/usr/local/lib/ruby/gems/2.3.0/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb(5.0ms) 渲染/usr/local/lib/ruby/gems/2.3.0/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb 呈现/usr/local/lib/ruby/gems/2.3.0/gems/actionpack-5.0.0.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb(1.1ms) 在救援/布局(96.4ms)内呈现/usr/local/lib/ruby/gems/2.3.0/gems/actionpack-`5.0.0.1/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb
答案 0 :(得分:1)
您说您的表单在用户的展示页面上呈现问题。如果你有这样的形式w /嵌套资源设置如下:
form_for [@user, @post]
这意味着您的表单需要访问@user
和@post
实例变量,无论何时呈现表单。在这种情况下,它位于用户控制器中的show动作中。因此,您的用户控制器应该具有以下内容:
def show
@user = User.find(params[:id])
@post = @user.posts.build
end
答案 1 :(得分:0)
我假设当您转到此帖子控制器操作处理的_post_form
路由时,您的posts#new
已加载:
def new
@post = Post.new
@user = User.find_by(id: params[:id])
end
嵌套路线(在本例中为用户&gt; post)将父资源的ID放在参数resource_id
中,在这种情况下它将是params[:user_id]
。所以,基本上,改变这一行:
@user = User.find_by(id: params[:id])
...为:
@user = User.find(params[:user_id])
这将访问参数中的正确ID,如果没有找到用户(使用find
而不是find_by
)会导致异常,这将在您获得之前提醒您任何问题到视图渲染。在你的情况下,@user
为零,你得到了你发布的form_for错误。
<强>更新强>
我从您的日志中看到您将进行users#show
操作,即此操作:
def show
@user = User.find(params[:id])
end
正如您所看到的,您没有设置您在此处传递给表单的@post
变量:
form_for [@user, @post]
将此添加到您的操作:
def show
@user = User.find(params[:id])
@post = Post.new
end