我刚刚完成了Hartl的RoR教程,现在我正在尝试更多的东西。
具体来说:我试图允许用户在任何页面上创建微博,方法是在header.html.erb
文件中渲染微博(在每页上呈现)。
部分:
<%= form_for(@micropost) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<div class="field">
<%= f.text_area :content, placeholder: "micropost" %>
</div>
<%= f.submit "Post", class: "btn btn-large btn-primary" %>
<% end %>
通过在链接到所述视图的控制器方法中添加undefined method 'model_name' for NilClass:Class
,我在未修复的任何页面上执行此操作导致部分:@micropost = current_user.microposts.build
的第1行出错。例如:
#in controllers/static_pages_controller.rb
def about
if signed_in?
@micropost = current_user.microposts.build
end
end
访问about
页
我一直试图找到一种方法来进行“全面修复”,这种方式可以在所有页面上使用,而不必在任何地方粘贴声明,任何想法?
答案 0 :(得分:3)
我认为你有SessionController,在Tutorial中按照以下指南创建,所以你可以在SessionController中创建一个helper方法,例如:
def post_micropost
if signed_in?
@micropost = current_user.microposts.build
end
end
然后,在StaticsController中,在控制器顶部添加before_filter
:
before_filter :post_micropost
因此,在StaticPagesController的任何操作中,如果用户已登录,用户也可以发布微博。
答案 1 :(得分:2)
您无需在此处使用form_for
构建器; Rails还为更通用的表单提供了form_tag
帮助程序:
<%= form_tag create_micropost_path, method: :post do %>
<%= text_area_tag :micropost_content, placeholder: "micropost" %>
<%= submit_tag "Post", class: "btn btn-large btn-primary" %>
<% end %>
这样,您无需在加载每个页面时构建对象,但microposts#create
仍然可以从params[:micropost]
提取数据。有关详细信息,请参阅here。
答案 2 :(得分:1)
您可以在表单
之前添加它<% @micropost ||= current_user.microposts.new %>