Rails - View中可用的对象,但不是对象的属性?

问题描述 投票:0回答:2

我有一个不寻常的问题,我可以访问一个对象,但不能在视图中访问它的属性。任何援助,指导,非常感谢。

这是我的模型(app/models/team_member.rb):

class TeamMember < ApplicationRecord
  attr_accessor :name
end

这是我的控制器(app/controllers/static_controller.rb):

class StaticController < ApplicationController
  def index
    @team_members    = TeamMember.all
  end
end

这是我的种子文件(db/seeds.rb):

puts 'POPULATING TEAM MEMBERS'
team_member = TeamMember.create! :name => 'Jones Namerson'
team_member = TeamMember.create! :name => 'John Johnson'
team_member = TeamMember.create! :name => 'Billy Bob'
team_member = TeamMember.create! :name => 'Tom Thompson'

这是我的观点(app/views/static/index.html.erb):

<div class="team-member">
          <a href="#bioModal1" class="portfolio-link" data-toggle="modal">
            <img src="http://www.canyon-news.com/wp-content/uploads/2015/09/Pope-Francis-1.jpg" class="img-responsive img-circle">
            <h4><%= @team_members[0] %></h4>
            <p class="text-muted">Co-Owner</p>
          </a>
        </div>

这会产生如下输出:

<image>THE IMAGE</image>

#<TeamMember:0x007fdd5e08c288>
Co-Owner

所以,我能够在视图中访问Object,但我的目标是访问对象属性。我将通过添加我真正想要看到的内容来更改我的观点:

<div class="team-member">
          <a href="#bioModal1" class="portfolio-link" data-toggle="modal">
            <img src="http://www.canyon-news.com/wp-content/uploads/2015/09/Pope-Francis-1.jpg" class="img-responsive img-circle">
            <h4><%= @team_members[0].name %></h4>
            <p class="text-muted">Co-Owner</p>
          </a>
        </div>

但这会产生:

<image>THE IMAGE</image>

Co-Owner

所以,基本上我的对象在View中可用,但不是它的属性?任何帮助是极大的赞赏。

ruby-on-rails rails-activerecord
2个回答
1
投票

你的模型中有这个:

attr_accessor :name

您的数据库中还有一个name列。 attr_accessor :name本质上是简写:

def name
  @name
end
def name=(s)
  @name = s
end

但ActiveRecord通常为数据库支持的属性提供访问器和mutator方法,并且您提供了自己的namename=方法(通过attr_accessor),这些方法对数据库中的name列一无所知。

从你的attr_accessor :name课程中删除TeamMember电话,你的问题应该消失。


0
投票

您的TeamMember类中的行“attr_accessor:name”不是必需的。与常规Ruby类不同,您正在创建ApplicationRecord的子类,因此只要您将TeamMember迁移到位,Active Record就会对其进行处理。

例如,如果运行类似“rails g model MyModel my_property:string”之后的“rake db:migrate”,Rails会创建一个扩展应用程序记录的MyModel类和一个带有name字段的my_models表。 MyModel类可以免费获取name属性的访问器,而无需添加任何代码。因此,像你正在做的那样再次添加可能会创建一个预期的行为

最后,如果您只想访问第一个对象,可以用@team_member = Team Member.first替换@team_members = Team Member.all。这只是一种增强。

我建议使用“rails c”进行测试

TeamMember.all
TeamMember.first
TeamMember.first.name
© www.soinside.com 2019 - 2024. All rights reserved.