【问题标题】:NameError when assigning instance of model to reference property将模型实例分配给引用属性时出现 NameError
【发布时间】:2014-01-03 15:44:06
【问题描述】:

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

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 分配给Post 实例的user_id 属性即可。但是,我想弄清楚为什么备用方法在 Camping 控制台中有效,而不是在我只是运行网络服务器时有效。

【问题讨论】:

  • 在将@user 分配给@post.user 之前,我能够通过将nil 分配给@post.user 来使其工作。我仍在试图弄清楚为什么没有奇怪的变通方法的简单分配不起作用。

标签: ruby camping


【解决方案1】:

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

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

【讨论】:

  • 是的,我做到了,但没用。尽管范围不同,但 Camping 模型在控制器中是可见的,因此完全限定名称不是必需的。如果模型和控制器之间存在类名冲突,则只需要使用全名。
  • 无赖。我认为它在您第一次引用 User 时没有引发错误,这很奇怪,所以我仍然认为这是命名空间以及 Camping 如何处理它们的问题。您是否尝试过在@post.user = @user 之前使用断点并评估@user.class?我建议使用Pry 进行调试。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 2011-10-30
    相关资源
    最近更新 更多