从任何页面访问部分的form_for(@variable)

时间:2012-11-19 04:19:29

标签: ruby-on-rails ruby-on-rails-3

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

时会修复此错误

我一直试图找到一种方法来进行“全面修复”,这种方式可以在所有页面上使用,而不必在任何地方粘贴声明,任何想法?

3 个答案:

答案 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 %>