【问题标题】:Adding a parameter to an instance variable in Rails在 Rails 中为实例变量添加参数
【发布时间】:2012-04-02 22:45:27
【问题描述】:

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

这是我想做的一个例子。

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

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

@post.username

我知道我可以创建一个全新的实例变量并将该信息放入其中,但我希望将所有内容保持在一个变量中。这也将使我的 json 渲染代码看起来更干净。

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    @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 包含对序列化选项的更全面的讨论。值得一读。

    【讨论】:

    • 谢谢,我不知道这个关联。无论如何将用户名信息添加到页面的 json 输出中?
    • 这是一个单独的问题,您如何将其呈现为 JSON?如果您使用默认值,则将选项传递给 to_json 调用。例如。渲染 :json => @post.to_json(:include => :user)。或者,如果您希望 Post JSON 对象在您的应用中随处可见用户名,则在 Post 模型中自定义 as_json 方法。
    • 非常感谢!这正是我所需要的。我在我的视图中使用 @post.user.username 关联并添加了 json 代码来让用户进入我的控制器。再次感谢您的快速回复。
    【解决方案2】:

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

    def username user
     user.username
    end
    

    【讨论】:

    • 你 @post.user.username 工作得很好。但是我的 json 输出仍然有 user_id = # 无论如何我还可以将用户名添加到页面的 json 输出中吗?
    • 在将json渲染为@post.to_json(:include => :user)时需要添加用户
    • 感谢 asitmoharna 这个解决方案有效。感谢您的快速回复
    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多