2011-12-30 31 views
2

私は簡単なブログのための管理者の名前空間付きコントローラを持っています。私のテストにいくつかのユーザーサポートを追加するとすぐにエラーが返されます。 I LET追加すると(ユーザが):未定義のメソッド `merge! 'はどのように修正するのですか? "a-sample-blog-post"の場合:String

@post = Post.new(params[:post].merge!(:user => current_user)) 

私の簡単なテストコードが通りである{...}と{...}前に、これは、PostsControllerの線13上にある

Failure/Error: post :create, :post => blog_post 
NoMethodError: 
    undefined method `merge!' for "a-sample-blog-post":String 
# ./app/controllers/admin/posts_controller.rb:13:in `create' 
# ./spec/controllers/admin/post_controller_spec.rb:13:in `block (4 levels) in <top (required)>' 
# ./spec/controllers/admin/post_controller_spec.rb:12:in `block (3 levels) in <top (required)>' 

ビット続く:

require 'spec_helper' 

describe Admin::PostsController do 
    describe "new blog post with valid attributes" do 

    let(:blog_post) { Factory(:post) } 
    let(:user) { Factory(:user, :admin => true) } 

    before { sign_in user } 

    it "should be valid" do 
     lambda do 
     post :create, :post => blog_post 
     end.should change(Post, :count).by(1) 
    end 
    end 
end 

そして、このことができます場合は、ここで私のfactories.rbファイルが

Factory.define :post do |post| 
    post.title   "A sample blog post" 
    post.content  "Duis mollis, est non commodo eget lacinia odio sem nec elit." 
end 

Factory.define :user do |user| 
    user.email "[email protected]" 
    user.password "foobar" 
    user.admin true 
end 

で誰かが私を理解するのに役立つことはできますか?

undefined method `merge!' for "a-sample-blog-post":String 

そして、それは、それが直接(新しいPostオブジェクトを作成するに近い関連意味とlet(:user)とは何の関係もありませんあなたのテストのpost :create, :post => blog_postセクションの間に起こっている:それはあなたを語っています

+0

(おそらく、工場出荷時の女の子のattributes_forメソッドを介した)属性のハッシュとblog_postを交換する必要がありますか? – clyfe

+0

oh ... @post = Post.new(params [:post] .merge!(:user => current_user)) – JeffC

+0

おそらく、あなたは 'Factory.build(:post).attributes'を' Factory :post) 'を実行します。 – taro

答えて

2

エラーが何でありますかセクション)。

Rubyのmergeメソッドはハッシュでのみ機能しますが、:userのエントリをマージしようとしているパラメータは、互換性のない文字列です。

私が見ていないのは、ユーザーを投稿と関連付ける方法です。たとえば、user_idというフィールドをPostというモデルで使用すると、ユーザーを特定の投稿と結びつけます(その投稿を作成したユーザーを教えてくれる)。

だから、少しこれを書き換える:

class Post < ActiveRecord::Base 
    # tell Rails what we should let the user update via a form 
    attr_accessible :title, :content 

    # == Schema Information 
    # 
    # Table name: posts 
    # 
    # id   :integer   not null, primary key 
    # user_id :integer 
    # title  :string(255) 
    # content :text  
    # created_at :datetime 
    # updated_at :datetime 
end 
あなたPostsControllerの中

def create 
    @post = Post.new(params[:post]) 
    @post.user_id = current_user.id 

    if @post.save 
    # great success 
    else 
    # Y U NO SAVE?! 
    end 
end 

そして、あなたのparams :title:contentを含める必要があります。

あなたは自動的にユーザーにあなたのFactory(:post)を関連付けたい場合は、あなたが行うことができます:

Factory.define :post do |post| 
    post.association :user 
    post.title   "A sample blog post" 
    post.content  "Duis mollis, est non commodo eget lacinia odio sem nec elit." 
end 
0
post :create, :post => blog_post 

が犯人です。 Rails 3.1以降では、テストで任意のルビオブジェクトをパラメータとして渡すことをやめます。あなたは、ライン13上posts_controller.rbに何

0

編集/app/controllers/comments_controller.rb

#comments_controller.rb 

def create 
    @post = Post.find(params[:post_id]) 
    @comment = @post.comments.create!(comment_params.merge(:user_id => current_user.id)) 
    redirect_to @post 
end 
関連する問題