2016-11-27 8 views
0

私のアプリで一種の投稿機能を実装しようとしていたので、私はこのエラーにぶつかりました。フォームの最初の引数には、nilを含めることはできません。または空にすることはできません。

ArgumentError in Projects#show 
first argument in form cannot contain nil or be empty 
<%= form_for(@micropost, html: { multipart: true }) do |f| %> 
    <%= render 'shared/error_messages', object: f.object %> 
    <div class="field"> 

Micropostコントローラ。 routes.rbを

resources :users do 
    member do 
    get :following, :followers 
    end 
end 
resources :projects do 
    resources :microposts 
end 

とフォームから

class MicropostsController < ApplicationController 
    before_action :logged_in_user, only: [:create, :destroy] 
    before_action :correct_user, only: [:create, :destroy] 

    def create 
    @project = Project.find(params[:project_id]) 
    @micropost = @project.microposts.build(micropost_params) 
    @micropost.user.id = current_user.id 
    if @micropost.save 
     flash[:success] = "Micropost created!" 
     redirect_to @project 
    else 
     @feed_items = [] 
     render 'static_pages/home' 
    end 
    end 

Micropost.model

class Micropost < ApplicationRecord 
    belongs_to :user 
    belongs_to :project 

    default_scope -> { order(created_at: :desc) } 
    mount_uploader :picture, PictureUploader 

    validates :user_id , presence: true 
    validates :project_id, presence: true 
    validate :picture_size 

    #... 
end 

エキス。

<%= form_for(@micropost, html: { multipart: true }) do |f| %> 
    <%= render 'shared/error_messages', object: f.object %> 
    <div class="field"> 
    <%= f.text_area :content, placeholder: "Compose new micropost..." %> 
    <%= hidden_field_tag :user_id, :value => current_user.id %> 
    </div> 
    <%= f.submit "Post", class: "btn btn-primary" %> 
    <span class="picture"> 
    <%= f.file_field :picture, accept: 'image/jpeg,image/gif,image/png' %> 
    </span> 
<% end %> 

-------更新1 ---------

プロジェクトコントローラ

class ProjectsController < ApplicationController 
    before_action :logged_in_user, only: [:index, :show, :create, :destroy] 
    before_action :correct_user || :admin_user , only: :destroy 

    def index 
    end 

    def show 
    @project = Project.find(params[:id]) 
    end 

    def new 
    @project = Project.new 
    end 

    def create 
    @project = current_user.projects.build(project_params) 
    if @project.save 
     flash[:success] = "Project Created" 
     redirect_to @project 
    else 
     render 'new' 
    end 
    end 

    def destroy 
    Project.find(params[:id]).destroy 
    flash[:success] = "Project Deleted" 
    redirect_to request.referrer || root_url 
    end 
end 

------アップデート2 ------- - [OK]を

class ProjectsController < ApplicationController 
before_action :logged_in_user, only: [:index, :show, :create, :destroy] 
before_action :correct_user, only: :destroy 
before_action :admin_user, only: :destroy 


def show 
    @project = Project.find(params[:id]) 
    @micropost = @project.microposts.build 
    #I cannot have them both defined at the same time so how do I go about this 
    @micropost = @project.microposts.paginate(page: params[:page]) 
end 

def new 
    @project = Project.new 
end 

def create 
    @project = current_user.projects.build(project_params) 
    if @project.save 
     flash[:success] = "Project Created" 
     redirect_to @project 
    else 
     render 'new' 
    end 
end 

def destroy 
    Project.find(params[:id]).destroy 
    flash[:success] = "Project Deleted" 
    redirect_to request.referrer || root_url 
    end 

private 

def project_params 
    params.require(:project).permit(:name,:category,:picture) 
end 

def correct_user 
    @project = current_user.projects.find_by(id: params[:id]) 
    redirect_to root_url if @project.nil? 
end 
end 
+0

すべきだと思います210あなたがそれを修正していないのにまだスペースを与えようとしていないなら '%= form_for(@ micropost)、html:{multipart:true})' – 7urkm3n

+0

あなたはプロジェクトコントローラ –

+0

@Deepakは現在更新中です1! – Eltorero1992

答えて

0

問題があるので、

プロジェクトでのコントローラのshowアクションは、あなたは@projectなくを初期化しますnil

なると私はあなたが@micropostのためのフォームをレンダリングしようとしているProjects#showで同じ部分をレンダリングされ、この場合にはnil

<%= form_for(@micropost, html: { multipart: true }) do |f| %> 

であることが

<%= form_for(@project, html: { multipart: true }) do |f| %> 
+0

あなたの答えをありがとう、 Projects#showにその特定のプロジェクトのmicropostをロードするように要求する行を追加して、micropostを初期化することは可能ですか? – Eltorero1992

+0

また、もし私が<%= form_for(micropost.new、html:{multipart:true})のようにそれを参照するなら、do | f | %>どのような意味合いがありますか? – Eltorero1992

+0

はい、プロジェクト内の変数を初期化することができます#表示アクション –

関連する問題