2016-09-19 59 views
1

我建立一个Facebook的克隆,我试图让每个用户的页面上的文本区域,让他们做出的帖子。我试过没有成功一大堆不同的东西,但在尝试访问用户的显示页面时,现在我收到此错误:与此代码的Rails:显示用户页面上的用户后的form_for嵌套路线

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 

​​
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)012渲染/ 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) 渲染/usr/local/lib/ruby/gems/2.3.0/gems/actionpack-`5.0.0.1/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb内救援/布局(96.4ms)

回答

1

您说你的表单在用户的展示页面上呈现问题。如果你有这种形式的W /嵌套的资源设置是这样的:

form_for [@user, @post] 

这意味着你的表格需要同时访问@user@post实例变量等。无论形式被呈现。在这种情况下,它在用户控制器中的显示操作中。所以,你的用户控制器应该有这样的事情:

def show 
    @user = User.find(params[:id]) 
    @post = @user.posts.build 
end 
+0

谢谢这给了我很多! –

+0

不客气:) – Ren

0

我假设你的_post_form加载时,当你去你的posts#new路线其由该帖子控制器操作处理:

def new 
    @post = Post.new 
    @user = User.find_by(id: params[:id]) 
end 

嵌套路由(在这种情况下,用户>后)将父资源的ID在参数resource_id,在你情况下,将params[:user_id]。因此,从本质上讲,改变这一行:

@user = User.find_by(id: params[:id]) 

...到:

@user = User.find(params[:user_id]) 

将访问在PARAMS正确的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 
+0

感谢您的答复。我尝试实施您所建议的更改,但在尝试访问用户页面时仍出现同样的错误 –

+0

请张贴您的新代码,以及您正在浏览的路径以及您的服务器日志以进行该操作 – DiegoSalazar

+0

好吧我用服务器日志信息编辑。至于路径,我认为我不需要提供一个,因为rails会看到form_for的东西,并根据[@user,@post]决定它的帖子或补丁以及发布到哪里? –