将模型实例分配给引用属性时的NameError

时间:2014-01-03 15:44:06

标签: ruby camping

我无法将模型实例分配给另一个模型的引用属性。相关代码如下:

module Blog::Models
    class Post < Base; belongs_to :user, dependent: :destroy end
    class User < Base; has_many :posts end
    ...
    class BasicFields < V 1.0
        def self.up
                create_table User.table_name do |t|
                    ...
                end
                create_table Post.table_name do |t|
                    ...
                    t.references :user
                end
        end
        ...
    end
end

module Blog::Controllers
    ...
    class PostEditN
        ...
        def post(post_num)
            @post = Post.find(post_num)
            @user = User.find(@input.user)
            ...
            @post.user = @user # Error thrown: NameError at /post/edit/1 uninitialized constant User
            # @post.user_id = @user.id << This is my currently working solution
            @post.save

            redirect PostN, post_num
        end
    end
    ...
end
...

当我在控制台模式下使用Camping为@post.user分配内容时,它是成功的,但我似乎无法在控制器中完成相同的行为。我只需将@user.id分配给user_id实例的Post属性即可。但是,我想弄清楚为什么替代方法在Camping控制台中工作,而不是在我只是运行网络服务器时。

2 个答案:

答案 0 :(得分:0)

我最好的猜测是这是命名空间的问题。在您显示的代码中User实际上是Blog::Models::User。在您的控制器中,上下文为Blog::Controllers。您是否尝试将控制器中的代码更改为?

@post = Blog::Models::Post.find(post_num)
@user = Blog::Models::User.find(@input.user)
...

答案 1 :(得分:0)

我能够解决我的问题。似乎我在创建新的Post记录时,我没有初始化User。因此,在分配@post.user时,它会抱怨user属性未初始化。我看到的唯一问题是尝试在oprhan Post记录上进行操作,根据与User的关系,该记录是无效数据。

相关问题