Rails:在具有嵌套路由的用户页面上显示用户发布form_for

时间:2016-09-19 15:22:41

标签: ruby-on-rails ruby

我正在建立一个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

2 个答案:

答案 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