8

サンプル プロジェクトを作成していますが、新しい投稿を作成しようとすると、「undefined method create for nil class」というエラーが表示されます。

私のコードは次のとおりです。

user.rb

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  has_one :post, dependent: :destroy
end

post.rb

class Post < ActiveRecord::Base
  belongs_to :user
end

posts_controller.rb

class PostsController < ApplicationController
  def create
    @user = current_user
    if @user.post.blank?
      @post = @user.post.create(params[:post].permit(:title, :text))
    end
    redirect_to user_root_path
  end
end

new.html.erb

<%= form_for([current_user, current_user.build_post]) do |f| %>
  <p>
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </p>
 
  <p>
    <%= f.label :text %><br>
    <%= f.text_area :text %>
  </p>
 
  <p>
    <%= f.submit %>
  </p>
<% end %>

しかし、何度も試した後、いくつかの変更を加えて動作し始めましたが、両方のコードの違いがわかりません。

user.rb

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  has_many :posts, dependent: :destroy
end

post.rb

class Post < ActiveRecord::Base
  belongs_to :user
end

posts_controller.rb

class PostsController < ApplicationController
  def create
    @user = current_user
    if @user.posts.blank?
      @post = @user.posts.create(params[:post].permit(:title, :text))
    end
    redirect_to user_root_path
  end
end

new.html.erb

<%= form_for([current_user, current_user.posts.build]) do |f| %>
  <p>
    <%= f.label :title %><br>
    <%= f.text_field :title %>
  </p>
 
  <p>
    <%= f.label :text %><br>
    <%= f.text_area :text %>
  </p>
 
  <p>
    <%= f.submit %>
  </p>
<% end %>

私のroutes.rbは

UserBlog::Application.routes.draw do
  devise_for :users, controllers: { registrations: "registrations" }

  resources :users do
    resources :posts
  end
  # You can have the root of your site routed with "root"
  root 'home#index'
end

両方のコードの違いを教えてください。

4

1 に答える 1

46

違いは、追加されたヘルパー メソッドにあり、新しい関連付けオブジェクトを構築または作成できます。アプローチは、アソシエーションhas_oneと比較してわずかに異なります。has_many

関連付けの場合、has_one関連付けられた新しいオブジェクトを作成するメソッドは になりますuser.create_post

関連付けの場合、has_many関連付けられた新しいオブジェクトを作成するメソッドは になりますuser.posts.create

于 2013-08-29T10:42:05.860 に答える