我有一个不寻常的问题,我可以访问一个对象,但不能在视图中访问它的属性。任何援助,指导,非常感谢。
这是我的模型(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中可用,但不是它的属性?任何帮助是极大的赞赏。
你的模型中有这个:
attr_accessor :name
您的数据库中还有一个name
列。 attr_accessor :name
本质上是简写:
def name
@name
end
def name=(s)
@name = s
end
但ActiveRecord通常为数据库支持的属性提供访问器和mutator方法,并且您提供了自己的name
和name=
方法(通过attr_accessor
),这些方法对数据库中的name
列一无所知。
从你的attr_accessor :name
课程中删除TeamMember
电话,你的问题应该消失。
您的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