【问题标题】:How do I display the data in belongs_to model?如何在 belongs_to 模型中显示数据?
【发布时间】:2014-06-28 08:12:25
【问题描述】:

我想在“_article.html.erb”上的 cmets 模型中显示“代码”。我应该如何修改以下来源?

.schema 文章

CREATE TABLE "articles" (
    "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
    "content" varchar(255), 
    "user_id" integer, 
    "comment_id" integer,
    "created_at" datetime, 
    "updated_at" datetime);

.schema cmets

CREATE TABLE "comments" (
    "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
    "code" integer, 
    "created_at" datetime, 
    "updated_at" datetime);

article.rb

class Article < ActiveRecord::Base
    belongs_to :user
    belongs_to :comment
end

comment.rb

class Comment < ActiveRecord::Base
    has_many :articles
end

用户/show.html.erb

    <%= render @articles %>

articles/_article.html.erb

<li>
    <%= article.comment.code %>
    <span class="content"><%= article.content %></span>
    by <%= article.user.name %>
</li>

users_controller.rb

class UsersController < ApplicationController

  def index
    @users = User.paginate(page: params[:page])
  end

  def show
    @user = User.find(params[:id])
    @articles = @user.articles.paginate(page: params[:page])
  end

在articles/_article.html.erb 中添加&lt;%= article.comment.code %&gt; 后,我的屏幕上出现以下错误。

Users#show 中的 NoMethodError

显示 e:/....../app/views/articles/_article.html.erb 其中第 2 行出现: nil:NilClass 的未定义方法“代码”

提取的源代码(第 2 行附近):

1 <li>
2    <%= article.comment.code %>
3    <span class="content"><%= article.content %></span>
4    by <%= article.user.name %>

模板包含的痕迹:app/views/users/show.html.erb

app/views/articles/_article.html.erb:2:in `_app_views_articles__article_html_erb__849237918_32363016'

app/views/users/show.html.erb:7:in `_app_views_users_show_html_erb__1073019711_34316652'

请求

参数:

{"id"=>"1"}

而Full Trace如下;

app/views/articles/_article.html.erb:2:in `_app_views_articles__article_html_erb__849237918_32363016'
actionpack (4.0.4) lib/action_view/template.rb:143:in `block in render'
activesupport (4.0.4) lib/active_support/notifications.rb:161:in `instrument'
actionpack (4.0.4) lib/action_view/template.rb:141:in `render'
actionpack (4.0.4) lib/action_view/renderer/partial_renderer.rb:399:in `block in collection_with_template'
actionpack (4.0.4) lib/action_view/renderer/partial_renderer.rb:395:in `map'
actionpack (4.0.4) lib/action_view/renderer/partial_renderer.rb:395:in `collection_with_template'
actionpack (4.0.4) lib/action_view/renderer/partial_renderer.rb:291:in `render_collection'
actionpack (4.0.4) lib/action_view/renderer/partial_renderer.rb:275:in `block in render'
actionpack (4.0.4) lib/action_view/renderer/abstract_renderer.rb:38:in `block in instrument'
activesupport (4.0.4) lib/active_support/notifications.rb:159:in `block in instrument'
activesupport (4.0.4) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.0.4) lib/active_support/notifications.rb:159:in `instrument'
actionpack (4.0.4) lib/action_view/renderer/abstract_renderer.rb:38:in `instrument'
actionpack (4.0.4) lib/action_view/renderer/partial_renderer.rb:274:in `render'
actionpack (4.0.4) lib/action_view/renderer/renderer.rb:47:in `render_partial'
actionpack (4.0.4) lib/action_view/helpers/rendering_helper.rb:27:in `render'
app/views/users/show.html.erb:7:in `_app_views_users_show_html_erb__1073019711_34316652'
actionpack (4.0.4) lib/action_view/template.rb:143:in `block in render'
activesupport (4.0.4) lib/active_support/notifications.rb:161:in `instrument'
actionpack (4.0.4) lib/action_view/template.rb:141:in `render'
actionpack (4.0.4) lib/action_view/renderer/template_renderer.rb:49:in `block (2 levels) in render_template'
actionpack (4.0.4) lib/action_view/renderer/abstract_renderer.rb:38:in `block in instrument'
activesupport (4.0.4) lib/active_support/notifications.rb:159:in `block in instrument'
activesupport (4.0.4) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.0.4) lib/active_support/notifications.rb:159:in `instrument'
actionpack (4.0.4) lib/action_view/renderer/abstract_renderer.rb:38:in `instrument'
actionpack (4.0.4) lib/action_view/renderer/template_renderer.rb:48:in `block in render_template'
actionpack (4.0.4) lib/action_view/renderer/template_renderer.rb:56:in `render_with_layout'
actionpack (4.0.4) lib/action_view/renderer/template_renderer.rb:47:in `render_template'
actionpack (4.0.4) lib/action_view/renderer/template_renderer.rb:17:in `render'
actionpack (4.0.4) lib/action_view/renderer/renderer.rb:42:in `render_template'
actionpack (4.0.4) lib/action_view/renderer/renderer.rb:23:in `render'
actionpack (4.0.4) lib/abstract_controller/rendering.rb:127:in `_render_template'
actionpack (4.0.4) lib/action_controller/metal/streaming.rb:219:in `_render_template'
actionpack (4.0.4) lib/abstract_controller/rendering.rb:120:in `render_to_body'
actionpack (4.0.4) lib/action_controller/metal/rendering.rb:33:in `render_to_body'
actionpack (4.0.4) lib/action_controller/metal/renderers.rb:26:in `render_to_body'
actionpack (4.0.4) lib/abstract_controller/rendering.rb:97:in `render'
actionpack (4.0.4) lib/action_controller/metal/rendering.rb:16:in `render'
actionpack (4.0.4) lib/action_controller/metal/instrumentation.rb:41:in `block (2 levels) in render'
activesupport (4.0.4) lib/active_support/core_ext/benchmark.rb:12:in `block in ms'
C:/RailsInstaller/Ruby1.9.3/lib/ruby/1.9.1/benchmark.rb:295:in `realtime'
activesupport (4.0.4) lib/active_support/core_ext/benchmark.rb:12:in `ms'
actionpack (4.0.4) lib/action_controller/metal/instrumentation.rb:41:in `block in render'
actionpack (4.0.4) lib/action_controller/metal/instrumentation.rb:84:in `cleanup_view_runtime'
activerecord (4.0.4) lib/active_record/railties/controller_runtime.rb:25:in `cleanup_view_runtime'
actionpack (4.0.4) lib/action_controller/metal/instrumentation.rb:40:in `render'
actionpack (4.0.4) lib/action_controller/metal/implicit_render.rb:10:in `default_render'
actionpack (4.0.4) lib/action_controller/metal/implicit_render.rb:5:in `send_action'
actionpack (4.0.4) lib/abstract_controller/base.rb:189:in `process_action'
actionpack (4.0.4) lib/action_controller/metal/rendering.rb:10:in `process_action'
actionpack (4.0.4) lib/abstract_controller/callbacks.rb:18:in `block in process_action'
activesupport (4.0.4) lib/active_support/callbacks.rb:433:in `_run__756630078__process_action__callbacks'
activesupport (4.0.4) lib/active_support/callbacks.rb:80:in `run_callbacks'
actionpack (4.0.4) lib/abstract_controller/callbacks.rb:17:in `process_action'
actionpack (4.0.4) lib/action_controller/metal/rescue.rb:29:in `process_action'
actionpack (4.0.4) lib/action_controller/metal/instrumentation.rb:31:in `block in process_action'
activesupport (4.0.4) lib/active_support/notifications.rb:159:in `block in instrument'
activesupport (4.0.4) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.0.4) lib/active_support/notifications.rb:159:in `instrument'
actionpack (4.0.4) lib/action_controller/metal/instrumentation.rb:30:in `process_action'
actionpack (4.0.4) lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
activerecord (4.0.4) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
actionpack (4.0.4) lib/abstract_controller/base.rb:136:in `process'
actionpack (4.0.4) lib/abstract_controller/rendering.rb:44:in `process'
actionpack (4.0.4) lib/action_controller/metal.rb:195:in `dispatch'
actionpack (4.0.4) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
actionpack (4.0.4) lib/action_controller/metal.rb:231:in `block in action'
actionpack (4.0.4) lib/action_dispatch/routing/route_set.rb:80:in `call'
actionpack (4.0.4) lib/action_dispatch/routing/route_set.rb:80:in `dispatch'
actionpack (4.0.4) lib/action_dispatch/routing/route_set.rb:48:in `call'
actionpack (4.0.4) lib/action_dispatch/journey/router.rb:71:in `block in call'
actionpack (4.0.4) lib/action_dispatch/journey/router.rb:59:in `each'
actionpack (4.0.4) lib/action_dispatch/journey/router.rb:59:in `call'
actionpack (4.0.4) lib/action_dispatch/routing/route_set.rb:674:in `call'
rack (1.5.2) lib/rack/etag.rb:23:in `call'
rack (1.5.2) lib/rack/conditionalget.rb:25:in `call'
rack (1.5.2) lib/rack/head.rb:11:in `call'
actionpack (4.0.4) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
actionpack (4.0.4) lib/action_dispatch/middleware/flash.rb:241:in `call'
rack (1.5.2) lib/rack/session/abstract/id.rb:225:in `context'
rack (1.5.2) lib/rack/session/abstract/id.rb:220:in `call'
actionpack (4.0.4) lib/action_dispatch/middleware/cookies.rb:486:in `call'
activerecord (4.0.4) lib/active_record/query_cache.rb:36:in `call'
activerecord (4.0.4)  lib/active_record/connection_adapters/abstract/connection_pool.rb:626:in `call'
activerecord (4.0.4) lib/active_record/migration.rb:373:in `call'
actionpack (4.0.4) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
activesupport (4.0.4) lib/active_support/callbacks.rb:373:in `_run__522467988__call__callbacks'
activesupport (4.0.4) lib/active_support/callbacks.rb:80:in `run_callbacks'
actionpack (4.0.4) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
actionpack (4.0.4) lib/action_dispatch/middleware/reloader.rb:64:in `call'
actionpack (4.0.4) lib/action_dispatch/middleware/remote_ip.rb:76:in `call'
actionpack (4.0.4) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
actionpack (4.0.4) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
railties (4.0.4) lib/rails/rack/logger.rb:38:in `call_app'
railties (4.0.4) lib/rails/rack/logger.rb:20:in `block in call'
activesupport (4.0.4) lib/active_support/tagged_logging.rb:68:in `block in tagged'
activesupport (4.0.4) lib/active_support/tagged_logging.rb:26:in `tagged'
activesupport (4.0.4) lib/active_support/tagged_logging.rb:68:in `tagged'
railties (4.0.4) lib/rails/rack/logger.rb:20:in `call'
actionpack (4.0.4) lib/action_dispatch/middleware/request_id.rb:21:in `call'
rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
rack (1.5.2) lib/rack/runtime.rb:17:in `call'
activesupport (4.0.4) lib/active_support/cache/strategy/local_cache.rb:83:in `call'
rack (1.5.2) lib/rack/lock.rb:17:in `call'
actionpack (4.0.4) lib/action_dispatch/middleware/static.rb:64:in `call'
rack (1.5.2) lib/rack/sendfile.rb:112:in `call'
railties (4.0.4) lib/rails/engine.rb:511:in `call'
railties (4.0.4) lib/rails/application.rb:97:in `call'
rack (1.5.2) lib/rack/lock.rb:17:in `call'
rack (1.5.2) lib/rack/content_length.rb:14:in `call'
rack (1.5.2) lib/rack/handler/webrick.rb:60:in `service'
C:/RailsInstaller/Ruby1.9.3/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service'
C:/RailsInstaller/Ruby1.9.3/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run'
C:/RailsInstaller/Ruby1.9.3/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread'

【问题讨论】:

  • &lt;%= article.comment.code %&gt; 会成功的。
  • 这对你有用吗?
  • 我在articles/_article.html.erb 中添加了&lt;%= article.comment.code %&gt;,但在Users#show 中出现了NoMethodError。为什么会出现此消息?
  • 你能用问题中的堆栈跟踪发布确切的错误吗?
  • Pavan,我更新了 Full Trace。提前致谢。

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

您可以像这样在ArticleComment之间使用relation

<%= article.comment.code %>

获取associated articlecommentcode

更好的方法是添加 delegate

class Article < ActiveRecord::Base
    belongs_to :user
    belongs_to :comment

    delegate :code, to: 'comment', allow_nil: true
end

这样做,你可以简单地把它称为​​

<%= article.code%>

有关详细信息,请参阅此API

【讨论】:

    【解决方案2】:

    foreign_keys

    进一步了解Pavan 的回答,您将最好地了解ActiveRecord 关联的工作原理:

    #app/models/comment.rb
    Class Comment < ActiveRecord::Base
       belongs_to :article
       belongs_to :user
    end
    
    #app/models/article.rb
    Class Article < ActiveRecord::Base
       has_many :comments
    end 
    

    这基本上建立了一个关系数据库连接,它将使用foreign_keys 拉取ActiveRecord 对象上的关联数据:

    #comments
    id | user_id | article_id | message | created_at | updated_at
    
    #articles
    id | user_id | title | message | created_at | updated_at
    

    --

    设置

    我不知道为什么你有 article belongs_to comment - 我想情况正好相反?

    我肯定会看看您希望 ActiveRecord 结构如何工作 - 标准的 has_many 关联非常标准:

    我会像上面描述的那样亲自建立关联,这将允许您执行以下操作:

    @article = Article.find params[:id]
    @article.comments.each do |comment|
       comment.code
    end
    

    【讨论】:

    • Rich Peck,感谢您的建议,对于造成的混乱,我深表歉意。但在我的模型中,article belongs_to commentcomment has_many article 是正确的。它不像博客。我将不胜感激有关此问题的任何其他建议。
    猜你喜欢
    • 2011-11-19
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    相关资源
    最近更新 更多