2014-12-29 1 views
0

다음 오류가 발생합니다. 내가 원하는 무엇Rails4 : 폼의 첫 번째 인수는 사이드 바의 form_for에 nil을 포함하거나 비워 둘 수 없습니다.

ArgumentError in Articles#index 
Showing e:/xxx/app/views/shared/_comment_form.html.erb where line #1 raised: 
First argument in form cannot contain nil or be empty 

는 주석을 입력 할 수 있도록 사용자의 모든 시간에 사이드 바에 text_area를 표시하는 것입니다.

comments과 어떤 관련도 없습니다.

@commentarticles_controllercomments_controller으로 설정해야합니까? 제가 몇 가지 시도했지만, 그들은 작동하지 않습니다.

\ 응용 프로그램 \ 전망 \ 레이아웃 \ application.html.erb

<!DOCTYPE html> 
<html> 
    <head> 
... 
    </head> 
    <body> 
    <%= render 'layouts/header' %> 
    <div class="container"> 
      <div class="row"> 
     <aside class="span3"> 
       <section> 
       <%= render 'shared/comment_form' %> 
       </section> 
     </aside> 
     <aside class="span9"> 
      <%= yield %> 
      <%= render 'layouts/footer' %> 
      <%= debug(params) if Rails.env.development? %> 
     </aside> 
     </div> 
    </div> 
    </body> 
</html> 

\ 응용 프로그램 \ 전망 \ shared_comment_form.html.erb

<%= form_for(@comment) do |f| %> 
    <%= render 'shared/error_messages', object: f.object %> 
    <div class="field"> 
    <%= f.text_area :content, placeholder: "Enter your comment..." %> 
    </div> 
    <%= f.submit "Post", class: "btn btn-large btn-primary" %> 
<% end %> 

\ 응용 프로그램 \ 컨트롤러 \ comments_controller.rb

class CommentsController < ApplicationController 

    def new 
    @comment = Comment.new 
    end 
    def create 
    @comment = Comment.new(comment_params) 
    if @comment.save 
     flash[:success] = "Sent your comment." 
     redirect_to root_url 
    else 
     redirect_to root_url 
    end 

    private 

    def comment_params 
     params.require(:comment).permit(:content) 
    end 

end 

\ app \ models \ comment.rb

class Comment < ActiveRecord::Base 
    default_scope -> { order('created_at DESC') } 
    validates :content, length: { maximum: 100 } 
end 

\ 응용 프로그램 \ 컨트롤러 \ articles_controller.rb

class ArticlesController < ApplicationController 
.. 
    def index 
    @articles = Article.all(limit: 10) 
    end 
.. 

이 오류를 방지하는 방법을 나에게 알려 주시기 바랍니다.

답변

2

그냥에서

<%= form_for(@comment) do |f| %> 

을 변경하려면 \app\views\shared_comment_form.html.erb ~

<%= form_for(Comment.new) do |f| %> 
+0

답변 해 주셔서 감사합니다. @spickermann. 그것은 작동합니다! – SamuraiBlue

+0

왜 작동합니까? 컨트롤러에서 객체를 생성하고 뷰에 변수를 전달하는 것과 같은 것은 아닙니다. – dehq

+0

@dehq : 물론 OP는 다른 경로와 다른 컨트롤러에서이 양식을 사용하려고합니다. 모든 컨트롤러에서'@ comment'를 초기화하는 것은별로 의미가 없습니다. – spickermann

0

예제에 코드가 현재 작성된 방식에 따라 컨트롤러 입력란에 컨트롤러 입력란에 @comment 인스턴스 변수가 있어야 사용자가 해당 양식을 사용하여 주석을 입력 할 수 있습니다. 이 사이트 차원이 양식을 사용하려고하는 경우, 그것은과 같이, 당신의 ApplicationController 클래스의 before_action에서 @comment 인스턴스 변수를 제공하는 것이 가장 좋습니다 :

class ApplicationController < ActionController::Base 
    before_action :create_comment 

    def create_comment 
    @comment = Comment.new 
    end 
end 
관련 문제