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

时间:2017-01-21 20:08:19

标签: ruby-on-rails rails-activerecord

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

这是我的模型( ... try { $sql = 'INSERT INTO events SET event_name = :event_name, event_date = :event_date, event_time = :event_time, event_location = :event_location, event_text = :event_text, event_weblink = :event_weblink, event_genre = :event_genre'; $s = $pdo->prepare($sql); $s->bindValue(':event_name', $_POST['event_name']); $s->bindValue(':event_date', $_POST['event_date']); $s->bindValue(':event_time', $_POST['event_time']); $s->bindValue(':event_location',$_POST['event_location']); $s->bindValue(':event_text', $_POST['event_text']); $s->bindValue(':event_weblink', $_POST['event_weblink']); $s->bindValue(':event_genre', $_POST['event_genre']); // $s->bindValue(':event_img', $_POST[$target_file]); $s->execute(); $response = array('message' => 'insert done'); ... ):

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>

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

<image>THE IMAGE</image>

#<TeamMember:0x007fdd5e08c288>
Co-Owner

但这会产生:

<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>

所以,基本上我的对象在View中可用,但不是它的属性?非常感谢任何帮助。

2 个答案:

答案 0 :(得分: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来电,您的问题就会消失。

答案 1 :(得分: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 = TeamMember.first替换@team_members = TeamMember.all。这只是一种增强。

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

TeamMember.all
TeamMember.first
TeamMember.first.name