Rails 3&设计:跟踪谁拥有用户帖子的个人资料

时间:2011-03-01 03:40:10

标签: ruby-on-rails post devise identify

我的应用有一个用户模型和一个帖子模型,其中用户has_many帖子和帖子belongs_to用户。帖子显示在用户的个人资料页面上。我希望任何用户都能够自己发布,或者任何其他用户的个人资料页面。但是,我遇到的问题是,虽然我知道谁在发帖(current_user),但我不知道谁的个人资料是current_user。我需要知道这一点,以便将新帖子分配给该用户的帖子。如何从当前正在查看的配置文件中提取用户ID信息,以便知道在哪里分配新帖子?

我的微博控制器看起来像:

class MicropostsController < ApplicationController
  before_filter :authenticate_user!

  def create
   @user_of_page = User.find_by_name(params[:id]) 
   @micropost = @user_of_page.microposts.build(params[:micropost])
    if @micropost.save
      flash[:success] = "Micropost created!"
      redirect_to :back
    else
      redirect_to about_path
    end
  end

  def destroy
  end
end

但是我得到一个NoMethodError:nil的未定义方法`microposts':NilClass。我认为这是因为我在创建user_of_page变量时犯了一些错误,但我不知道那是什么!

谢谢Sam。我接受了你的建议并最终做到了这样:

  1. 我在Micropost表中添加了一个名为belongs_to_id的列。

  2. 然后,我使用微博表单中的隐藏字段将用户显示视图显示的用户的ID传递给微博控制器,如下所示:

       <%= form_for @micropost do |f| %>
       <%= render 'shared/error_messages', :object => f.object %>
    
       <div class="field">
          <%= f.label :content, "Why that mood?" %>
          <%= f.text_area :content %>
       </div>
    
       <div class="field">
          <%= f.hidden_field :author, :value => current_user.name %>
          <%= f.hidden_field :belongs_to_id, :value => @user.id %>
      <%= f.hidden_field :agree, :value => "0" %>
      <%= f.hidden_field :disagree, :value => "0" %>
      <%= f.hidden_field :amused, :value => "0" %>
       </div>
    
       <div class="actions">
          <%= f.submit "Submit" %>
       </div>
     <% end %>
    
  3. 然后我使用这个id值来搜索用户在微博控制器中分配帖子,如下所示:

    class MicropostsController < ApplicationController
      before_filter :authenticate_user!
    
      def create
       @user_of_page = User.find(params[:micropost][:belongs_to_id]) 
       @micropost = @user_of_page.microposts.build(params[:micropost])
        if @micropost.save
          flash[:success] = "Micropost created!"
          redirect_to :back
        else
           redirect_to about_path
        end
      end
    
      def destroy
      end
    end
    
  4. 魔术!再次感谢,你帮助我以正确的方式看待它。

1 个答案:

答案 0 :(得分:1)

我会这样做:

class profiles_controller < AC
  ...
  def show
    @profile = User.find(params[:id]).profile || current_user.profile
    @post = Post.new       
  end
  ..
end

/profiles/show.html.erb
... 
Name: <%= @profile.full_name %> 
...
<%= form_for @post do |f| %>
  <%= hidden_field_tag @profile.user %>
  ...
<% end %>

class microposts_controller < AC
  def create
    profile_user = User.find(params[:user_id]) # Owner of the profile current_user is on
    ..
  end
end

未经测试。希望这会有所帮助。