0

我刚刚完成了 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 %>

这样做会导致部分的第 1 行出现错误:undefined method 'model_name' for NilClass:Class在我没有通过添加@micropost = current_user.microposts.build链接到所述视图的控制器方法修复的任何页面上。例如:

#in controllers/static_pages_controller.rb
def about
  if signed_in?
    @micropost = current_user.microposts.build
  end
end

about当我访问该页面时将修复此错误

我一直在尝试找出一种方法来进行“一揽子修复”,该方法可以在所有页面上使用,而无需在任何地方粘贴声明,有什么想法吗?

4

3 回答 3

3

我认为你有 SessionController,按照教程中的指南创建,所以你可以在 SessionController 中创建一个辅助方法,例如:

def post_micropost
  if signed_in?
    @micropost = current_user.microposts.build
  end
end

然后,在您的 StaticsController 中,before_filter在控制器顶部添加一个:

before_filter :post_micropost

因此,在 StaticPagesController 的任何操作中,如果用户已登录,也可以发布微博。

于 2012-11-19T04:40:17.083 回答
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]. 请参阅此处了解更多信息。

于 2012-11-19T04:37:07.110 回答
1

您可以在表格之前添加它

<% @micropost ||= current_user.microposts.new %>
于 2012-11-19T06:42:29.183 回答