2

Rails アプリで、エラー メッセージが正しく表示されません。その理由は、検証が失敗したときに、コントローラーがレンダリングではなくリダイレ​​クトを行ったためだと思います。ただし、レンダリングに問題があります。すべての変数が欠落しているようです。たとえば、私の pub_messages#create では...

def create
    @pub_message = current_user.pub_messages.build
    @pub_message.to_id = params[:pub_message][:to_id]
    @pub_message.user_id = current_user.id
    @pub_message.content = params[:pub_message][:content]
    if @pub_message.save
        flash[:success ] = "Your post has been sent"
        redirect_to user_path(params[:pub_message][:to_id])
    else
        render 'users/show'
    end
end

^(ちなみに、セキュリティ上の問題があるため、各属性を手動で保存しているため、:to_id attr_accessible は作成しませんでした)

しかし、ポイントに戻ると、「users/show」をレンダリングすると、変数が見つからないように見えます。それは私のユーザーのショービューに入り、それは不平を言います...

undefined method `name' for nil:NilClass
1: <% provide(:title, @user.name) %>

ただし、users#show アクションに行った場合は、@user と宣言しました。

 def show
    @user = User.find(params[:id])
    @current_user = current_user
    if user_signed_in?
        @message = current_user.messages.build
        @pub_message = current_user.pub_messages.build
    end
    @feed_items = @user.feed.paginate(page: params[:page], per_page: 20)
 end

私は行方不明ですか、それとも何か間違っていますか?ありがとうございました

更新:ショーアクションには行かないようです。表示されないエラー メッセージを解決するにはどうすればよいですか? リダイレクトすると、ブラウザはすぐに新しいページを要求しませんか? したがって、私のエラーメッセージは表示されませんか?

UPDATE2: そう...私は実際にはモデルの「新しい」ページから来ているのではなく、代わりにユーザーのショーテンプレートから来ています。テンプレートには、次のものがあります

<%= form_for([current_user, @pub_message])  do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
    <%= f.hidden_field :to_id, :value => @user.id %>
  <div class="micropost_message_field">
    <%= f.text_area :content, placeholder: "Comments?", :id => 'public_message_text' %>
  </div>
  <%= f.submit "Post", class: "btn btn-large btn-primary" %>
<% end %>

これはオブジェクトが構築される場所であり、最終的に私の pub_messages#create に送られます。すべての変数を再初期化する場合、共有フォルダー内のすべてのテンプレートも移動する必要がありますか?

またはこれを行うためのより良い方法はありますか?'new' をレンダリングしてから users#show にリダイレクトするようなものかもしれません。

4

3 に答える 3

3

リダイレクトはフラッシュ メッセージを表示しますが、検証エラーは表示しません。フラッシュエラーメッセージを設定していないので、モデルの検証エラーを表示したいと思います。そのためには、リダイレクトではなくレンダリングに固執する必要があります。

レンダリングするには、show ビューに必要なすべての変数を初期化する必要があります (表向きはユーザーの移動元である「new」をレンダリングしない理由はわかりませんが)。これをきれいに行うには、show メソッドのすべてのコンテンツを別のメソッドに移動し、そのメソッドを show と失敗した create から呼び出します。

def initialize_show_vars
   @user = User.find(params[:id])
    @current_user = current_user
    if user_signed_in?
        @message = current_user.messages.build
        @pub_message = current_user.pub_messages.build
    end
    @feed_items = @user.feed.paginate(page: params[:page], per_page: 20)
end

def show
  initialize_show_vars
end

def create
  <stuff ...>
  if @pub_message.save
    <stuff ...>
  else
    flash[:error] = "Didn't work"
    initialize_show_vars
    render 'users/show'
  end
end
于 2012-06-05T03:04:51.330 に答える
2

レンダリングすると、コントロールはこのアクションからビュー テンプレートに直接移動し、users_controller には触れません。そのため、変数が欠落しています。

ただし、リダイレクトすると、ユーザーから新しいリクエストが届いたかのように users_controller に移動します。

の代わりにrender 'users/show'、試してくださいredirect_to :controller => :users, :action => :show, :id => current_user.id

リダイレクトには、フラッシュ通知とエラーが表示されます。このような状況では、リダイレクトが非常に一般的に使用されます。

それは役に立ちますか?

于 2012-06-04T20:09:18.257 に答える
0

show アクションを呼び出すのではなく、テンプレートをレンダリングするだけなので、@user定義されません。

テンプレートをレンダリングする代わりに、別のリダイレクトを試すことができます。

于 2012-06-04T20:06:10.897 に答える