0

我的应用程序有一个用户模型和一个帖子模型,其中用户有_许多帖子和帖子属于_用户。帖子显示在用户的个人资料页面上。我希望任何用户都能够在他自己或任何其他用户的个人资料页面上发布。但是,我遇到的问题是,虽然我知道谁在发帖 (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: undefined method `microposts' for nil:NilClass。我认为这是因为我在创建 user_of_page 变量时犯了一些错误,但我不知道那是什么!

解决方案

谢谢山姆。我接受了你的建议,最终这样做了:

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

  2. 然后,我使用 micropost 表单中的隐藏字段将其个人资料从用户显示视图中显示的用户的 id 传递给 micropost 控制器,如下所示:

       <%= 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 值在 micropost 控制器中搜索要分配帖子的用户,如下所示:

    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 回答 1

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

未测试。希望这可以帮助。

于 2011-03-01T05:23:38.247 回答