【问题标题】:Saved user id in Posts model, how do I render that user?在 Posts 模型中保存了用户 ID,我如何呈现该用户?
【发布时间】:2011-05-22 01:08:38
【问题描述】:

当用户在个人资料上发帖时,个人资料所有者的用户 ID 以整数形式保存在 :poster 中(在帖子模型中)。如何查找和呈现该用户/用户的信息?

更多信息:

  1. 使用Slugged gem
  2. 尝试生成帖子提要时,当我在视图中调用 feed_item.user 时,它会将我定向到发布帖子的用户,而不是发布帖子的个人资料的用户。

Feed 项目视图

Feed 视图

页面控制器主页功能

@postee 是我根据为每个帖子保存的用户 ID 查找用户的微弱尝试。理想情况下,我希望能够链接到发布帖子的个人资料的用户,并在我的视图中显示有关该用户的信息(例如用户的用户名)。我一直在修修补补,但被卡住了,有什么想法吗?非常感谢您的帮助,如果需要任何其他信息,请告诉我!

编辑

发布表单视图

<%= form_for @post do |f| %>
<%= f.hidden_field :name, :value => current_user.name %>
<%= f.hidden_field :poster, :value => @user.id %>
<div class="postbox">

  <div class="postfield">
    <%= f.text_area :content %>
  </div>
  <div class="postsubmit">
    <%= f.submit "Submit" %>
  </div>
</div>

用户控制器显示动作

def show
  @user = User.find_by_cached_slug(params[:id])
  @posts = Post.find_all_by_poster(@user.id)
  @post = Post.new
if user_signed_in?
  @post = Post.new
  end

respond_to do |format|
  format.html # show.html.erb
  format.xml { render :xml => @user }
end
end

【问题讨论】:

  • 不要使用您的代码截图,而是将您的代码粘贴到带有四个空格缩进的问题中
  • 在 Stack Overflow 上,您不会在问题解决后将其删除。
  • 您能否将您的解决方案发布为答案,或者如果您使用了斯蒂芬默多克的答案,请接受它?我相信很多其他人都想知道如何解决这个问题。

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


【解决方案1】:

您的方法有点奇怪,因为您使用属性:poster 而不是:user_id 这是rails 约定

不管怎样,试着把这样的东西放在你的视野里

@post.poster.email # to return the email address of your user

上面的代码取决于你的用户模型有一个:email 属性 更改您希望返回的任何属性的电子邮件,无论是用户名等

您的模型中指定的帖子和用户之间是否存在关系?即belongs_to :user

您是否有理由不使用常规的 :model_name_id 作为关联记录?

【讨论】:

  • 嘿斯蒂芬,谢谢你的建议!该方法很奇怪,因为 :user_id 包含发布帖子的用户的用户 ID,而 :poster 包含发布个人资料的用户的用户 ID。在尝试您的建议时,我没有使用@post 实例变量,但我尝试了 post.poster.email 和 feed_item.poster.email,两者都不起作用(9:Fixnum 的未定义方法“电子邮件”)但没有添加 .email最后,两者都呈现正确的:poster id。而且我已经建立了关系,Post belongs_to :user,User has_many :posts。还有什么我可以尝试的吗?谢谢!
  • @ahuang7:请告诉我们您是如何定义poster 方法的。
  • 嘿 ryan,我在编辑中发布了上面的代码。感谢您的帮助,以后会记得粘贴代码,而不是截图!作为一个附带问题,如果有更好的方法来重构我的代码,作为 Rails 学生,我很想学习它。
【解决方案2】:

最终,我决定以一种非混乱的方式来做,只是为了让功能正常工作。虽然我怀疑如果你能以某种方式将 :poster 中的用户 ID 绑定到一个新模型,并设置了(有很多、属于等)关系,那么这样会更好。 (我相信这就是 stephenmurdoch 的回答所尝试的,只是 :user_id 已经与发帖用户绑定了一个问题。)

我在发布每个帖子时保存了更多用户信息,然后为每个提要项呈现配置文件帖子接收者的信息。此外,由于用户有基于 cached_slug 的唯一 URL,我能够使用 创建指向发布帖子的个人资料的链接。

发布表单视图

<%= form_for @post do |f| %>
<%= f.hidden_field :name, :value => current_user.name %>
<%= f.hidden_field :poster, :value => @user.id %>
<%= f.hidden_field :postername, :value => @user.name %>
<%= f.hidden_field :posterusername, :value => current_user.username %>
<%= f.hidden_field :postercachedslug, :value => @user.cached_slug %>
<div class="postbox">

  <div class="field">
    <%= f.text_area :content %>
  </div>
  <div class="submit">
    <%= f.submit "Submit" %>
  </div>
</div>

Feed 项目视图

<div class="profilepic">
<% if feed_item.user.profile_file_name == nil %>
<%= link_to image_tag("thumb.jpeg"), feed_item.user %>
<% else %>
  <%= link_to image_tag(feed_item.user.profile.url(:thumb)), feed_item.user %>
 <% end %>
</div>
<span class='feeditem'>
    <div class='row1'>
      <strong>
        <span class="user"><%= link_to feed_item.name, feed_item.user %> </span>
      </strong>
      <%= image_tag("arrow.png") %>
      <span class="name"><%= link_to feed_item.postername, feed_item.postercachedslug %></span>
    </div>
  <div class='row2'>
    <span class="content"><%= feed_item.content %></span>
  </div>
  <div class='row3'>
<span class="timestamp">
  <%= time_ago_in_words(feed_item.created_at) %> ago.
</span>
    <% if current_user?(feed_item.user) %>
        <%= link_to "delete", feed_item, :method => :delete,
                    :confirm => "You sure?" %>
    <% end %>
  </div>
  </span>

【讨论】:

    猜你喜欢
    • 2011-01-14
    • 1970-01-01
    • 2016-10-12
    • 2014-04-11
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多