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

これを行うと、上記のビューにリンクするコントローラーメソッドをundefined method 'model_name' for NilClass:Class追加することで修正していないページで、パーシャルの #1 行目にエラーが発生しました。@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を持っていると思います.Tutorialのガイドに従って作成されているので、SessionControllerでヘルパーメソッドを作成できます.例:

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

次に、StaticsController で、before_filterコントローラーの先頭に a を追加します。

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#createparams[:micropost]. 詳細については、こちらを参照してください。

于 2012-11-19T04:37:07.110 に答える
1

フォームの前にこれを追加できます

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