1

Rails ガイドのブログの作成に取り組んでいて、5.7: 投稿の表示で行き詰まっています。

Rails Guide のセクション 5.7 の NoMethodError という回答を既に参照しており、別の問題を解決しましたが、ここで立ち往生しています。それは私がメソッドpermitを定義したことがないことを私に伝えていますが、それは私が理解しており、どこにも定義されていませんが、ガイドは私にそれを定義させたり、定義する必要があることを参照したりしませんでした. 遊んでエラーが返ってきたので、実際に投稿データを保存する必要があると思いますか?

投稿を送信するところまで到達できますが、送信すると返されるのは次の内容だけです。

NoMethodError in PostsController#create

undefined method `permit' for nil:NilClass

エラー メッセージは、次のコードの 2 行目でエラーが発生したことを示しています。

  def create    
    @post = Post.new(params[:post].permit(:title, :text))

    @post.save
    redirect_to @post

私の posts_controller ファイルは次のようになります。

class PostsController < ApplicationController
  def new
  end

  def create
    @post = Post.new(params[:post].permit(:title, :text))

    @post.save
    redirect_to @post
  end

def show
  @post = Post.find(params[:id])
end

  private
    def post_params
      params.require(:post).permit(:title, :text)
    end           
end

create メソッドから削除すると.permit(:title, :text)(ここで提案されているように: Can't create new post )、エラーは発生しなくなりましたが、次のようなページが表示されます。

Title:

Text:

テキストを提出したにもかかわらず。

詳細情報を投稿する必要があるかどうか、または修正を簡単に見つける必要があるかどうか、初めてのポスター、Rails の新しいことを教えてください。

4

4 に答える 4

2

私はこのチュートリアルに取り組んできましたが、問題が何であるかを理解しました。やってるとき

@post.update(params[:post].permit(:title, :text))

POST パラメータで permit 関数を呼び出しています。これは問題ありませんが、ページが初めて読み込まれたときに if ステートメントに到達し、フォームが送信されていないため、:postキーが params ハッシュ内になく、nil:nilClass エラーが発生します。以下に示すように、ハッシュ内にチェックを追加し:post、if ステートメント内で許可を行うと、すべて正常に動作するはずです。

if params.has_key?(:post)
    @post.update(params[:post].permit(:title, :text))
    redirect_to @post
else
    render 'edit'
end
于 2013-07-18T19:54:08.590 に答える
1

私はそれを考え出した。4.0 より前のバージョンの Rails を実行している場合 (「rails --version」を実行)、ガイドは間違っています...明らかに 4.0 でのみ機能する情報を提供しています。コントローラ ファイルの正しいステートメントは次のとおりです。

@post = Post.new(params[:post])

美術

于 2013-07-19T19:36:42.277 に答える
1

バージョン 3.2.13 を使用すると動作しません 問題を解決するには、「.permit(:title, :text)」の部分を削除します

于 2013-08-23T14:05:20.617 に答える
1

表示に誤りがある可能性があります。(app/views/posts/new.html.erb) パラメータ :post がコントローラに正しく渡されていないようです。

未定義のメソッドエラーを防ぐために、次のように書くことができますparams.require(:post).permit(:title, :text)

于 2014-02-08T08:33:20.887 に答える