Как мне исправить неопределенный метод `слияние! 'для "a-sample-blog-post": строка - PullRequest
2 голосов
/ 30 декабря 2011

У меня есть администратор пространства имен администратора для простого блога, который я пишу, и как только я добавляю поддержку пользователей в свой тест, я получаю сообщение об ошибке, эта ошибка возникает, только когда я добавляю let (: user) {...} и перед {...} битом

 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)>'

Это строка 13 из PostsController:

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

Мой простой тестовый код выглядит следующим образом

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 "foo@bar.com"
  user.password "foobar"
  user.admin true
end

Может кто-нибудь помочь мне понять?

Ответы [ 3 ]

2 голосов
/ 31 декабря 2011

Это говорит вам, что ошибка:

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

И это происходит только в разделе post :create, :post => blog_post вашего теста, что означает, что он напрямую связан с созданием нового объекта Post (и не имеет никакого отношения к разделу let(:user)).

Метод 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

А ваши параметры должны включать :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 голосов
/ 22 декабря 2015

Редактировать /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
0 голосов
/ 31 декабря 2011
 post :create, :post => blog_post

является виновником.Rails 3.1 и выше не позволяют вам передавать произвольные объекты ruby ​​в качестве параметров в ваших тестах.Вам следует заменить blog_post на хэш атрибутов (возможно, с помощью метода attributes_for фабричной девушки)

...