【问题标题】:basic Ruby on Rails undefined method issue基本的 Ruby on Rails 未定义方法问题
【发布时间】:2012-06-25 03:26:30
【问题描述】:

我是 RoR 开发的相对业余爱好者(大约一个月的经验),并且我一直在引用来自不同控制器的变量,直到现在都没有问题。我正在为博客开发 CMS,但我无法让博客作者的用户名出现在索引或显示页面上。我收到“nil:NilClass 的未定义方法‘用户名’”错误。但是,我可以得到身份证。任何人都可以帮助指出我的代码中的错误吗?我将不胜感激。

这是博客模型:

    class Blog < ActiveRecord::Base
    attr_accessible :post, :title

    has_one :users
    belongs_to :user

        end

这是博客控制器的显示和索引部分:

    def index
      @users = User.all
      @blogs = Blog.all


     respond_to do |format|
       format.html # index.html.erb
       format.json { render json: @blogs }
       end
         end

       # GET /blogs/1
       # GET /blogs/1.json
   def show
     @blog = Blog.find(params[:id])
     @users = User.all      

         respond_to do |format|
           format.html # show.html.erb
           format.json { render json: @blog }
         end
      end

这里是 index.html.erb 代码:

     <% @blogs.each do |blog| %>
       <tr>
        <td><%= blog.title %></td>
        <td><%= blog.post %></td>
        <td><%= blog.user.username %></td> #blog.user_id works perfectly here.
        <td><%= link_to 'Show', blog %></td>
        <td><%= link_to 'Edit', edit_blog_path(blog) %></td>
        <td><%= link_to 'Destroy', blog, method: :delete, data: { confirm:'sure?'} %></td>
       </tr>
         <% end %>

这是 show.html.erb 文件的代码:

      <p>
      <b>Title:</b>
       <%= @blog.title %>
       </p>

       <p>
       <b>Author:</b>
        <%= @blog.user.username %>
       </p>

       <p>
       <b>Post:</b>
       <%= @blog.post %>
       </p>

这是博客控制器中的创建代码:

      Here is the create code:

    # POST /blogs
    # POST /blogs.json
        def create
         @blog = Blog.new(params[:blog])
         @blog.user_id = current_user

           respond_to do |format|
            if @blog.save
              format.html { redirect_to @blog, notice: 'Blog was successfully created.' }
              format.json { render json: @blog, status: :created, location: @blog }
               else
                format.html { render action: "new" }
                format.json { render json: @blog.errors, status: :unprocessable_entity }
              end
            end
          end

【问题讨论】:

  • 你的has_one: users不应该是单数吗?换句话说,Blog 类应该有has_one: user。

标签: ruby-on-rails ruby sqlite rails-activerecord


【解决方案1】:
class Blog < ActiveRecord::Base
   attr_accessible :post, :title

    #has_one :users // remove this line of code..
    belongs_to :user

end

另外检查,可能是 user_id 指向的用户记录不存在..

【讨论】:

    【解决方案2】:

    请检查您的 blogs 表并查看 user_id 是否存在于每个创建的博客中。

    还要检查您的用户模型是否根据您所需的关联进行更改。

    如果您使用的是一对一关系,那么您的用户模型应该有

    class User < ActiveRecord::Base
      has_one :blog
    end
    

    或者如果你使用的是一对多关系,那么用户模型应该有

    class User < ActiveRecord::Base
      has_many :blogs
    end
    

    通过以下方式更改您的博客模型。

    class Blog < ActiveRecord::Base
       attr_accessible :post, :title
       belongs_to :user
    end
    

    尝试通过在您的博客控制器中添加以下更改来创建新博客。

    def create
     @blog = Blog.new(params[:blog])
     @blog.user_id = current_user.id
    
     respond_to do |format|
      if @blog.save
       format.html { redirect_to @blog, notice: 'Blog was successfully created.' }
       format.json { render json: @blog, status: :created, location: @blog }
      else
       format.html { render action: "new" }
       format.json { render json: @blog.errors, status: :unprocessable_entity }
      end
     end
    end
    

    你的用户表有用户名列吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      • 2016-12-15
      • 2019-10-31
      相关资源
      最近更新 更多