如何使用Ruby on Rails关联?

时间:2016-12-09 17:28:07

标签: ruby-on-rails ruby

说明:我正在关注:https://www.railstutorial.org/book/toy_app

上的toy_app教程

我在第2.3.3节中的运动问题上遇到问题

问题:编辑用户显示页面以显示用户第一个微博的内容。 (使用您的技术复杂性(方框1.1)根据文件中的其他内容猜测语法。)通过访问/ users / 1确认它有效。

在我的 app / views / users / show.html.erb 文件中。我尝试使用 @ micropost.content 对象来显示与用户关联的所有内容。

<p id="notice"><%= notice %></p>

<p>
  <strong>Name:</strong>
  <%= @user.name %>
</p>

<p>
  <strong>Email:</strong>
  <%= @user.email %>
</p>

<p>
  <strong>Content:</strong>
  <%= (<%= @micropost.content %>) %>
</p>


<%= link_to 'Edit', edit_user_path(@user) %> |
<%= link_to 'Back', users_path %>

结果

  

用户#show中的NoMethodError

     

未定义的方法&#39;内容&#39;为零:NilClass

结论

我是否需要为 app / view / user 文件的帖子生成 form_for ?或者,因为我在私人&#39; micropost_params&#39;中设置我的:内容对象。我的microposts_controller.rb中的方法,它不允许控制器之间的对象数据传输?

我在控制台中测试了以下代码行,以确保关联正常:

first_user = User.first
first_user.microposts
micropost = first_user.microposts.first
micropost.user

我觉得我需要在用户控制器文件中定义一个方法,该方法可以访问我的MicroPosts类中的my:content对象。

1 个答案:

答案 0 :(得分:1)

您的show操作应如下所示。

def show
  @user = User.find(params[:id])
  @micropost = @user.microposts.first
end

现在,在视图中,您可以使用@micropost.content访问微博的内容。如果用户没有与他相关的微博(没有写过微博)怎么办?在这种情况下,@user.microposts.first将为nil。如果您不确定我的意思,请尝试在rails控制台中使用它。

<% if @micropost %>
  <%= @micropost.content %>
<% else %>
  <p> User has no microposts </p>
<% end %>