我的应用有一个用户模型和一个帖子模型,其中用户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。我接受了你的建议并最终做到了这样:
我在Micropost表中添加了一个名为belongs_to_id的列。
然后,我使用微博表单中的隐藏字段将用户显示视图显示的用户的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 %>
然后我使用这个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
魔术!再次感谢,你帮助我以正确的方式看待它。
答案 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
未经测试。希望这会有所帮助。