在Rails中向实例变量添加参数

时间:2012-03-17 20:21:41

标签: ruby-on-rails ruby-on-rails-3

我正在创建一个传递给我视图的实例变量。这个变量'post'有一个与之关联的user_id,我想添加一个名为'username'的额外属性,所以我也可以传递它并在视图中使用它。

以下是我想要做的一个例子。

@post = Post.find(params[:id])
@post.username = User.find(@post.user_id).username

我的用户模型中存在用户名列,但我的歌曲模型不存在。所以它不会让我使用

@post.username

我知道我可以创建一个全新的实例变量并将该信息放在那里,但我想在一个变量中保持一切美观和整洁。这也将使我的json渲染代码看起来更清晰。

关于如何实现这一目标的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:4)

根据user_id模型中Post的存在,您可能已经设置了可以检索用户名的关联。简单地使用现有的关联可能会省去很多麻烦:

@post = Post.find(params[:id])
username = @post.user.username

如果您可能一次查询多个帖子(例如,在索引页面上,调用.includes告诉Rails急切加载关联将帮助您避免the N+1 problem

@posts = Post.includes(:user).all

最后,要在JSON输出中包含关联记录,请在序列化时传递:include参数:

# in controller
render :json => @post.to_json(:include => :user)

This question包含对序列化选项的更全面的讨论。非常值得一读。

答案 1 :(得分:2)

无需传递单独的实例变量。 1.您可以在视图中使用@post.user.username。 2.或者你可以创建一个助手并传递@post.user

def username user
 user.username
end