2016-10-16 3 views
0

私のアプリは、多くのポジションを持つポートフォリオを持っています。各ポジションには多くの動きがあります。部分的なフォームにエラーメッセージを表示しようとしています

私はすべてのポジションを示しています。部分的

<p> 
    <strong>Name:</strong> 
    <%= @portfolio.name %> 
</p> 

<%= render partial: @positions %> 

<%= render 'positions/form' %> 

<%= link_to 'Edit', edit_portfolio_path(@portfolio) %> | 
<%= link_to 'Back', portfolios_path %> 

私の位置は次のように書かれている。このような部分的に私のエラーで

<ul> 
    <li><%= position.name %></li> 
    <li><%= position.quantity %></li> 
    <li><%= position.ticker %></li> 
</ul> 
<%= form_for [@portfolio, position, @movement] do |f| %> 
    <div id = "movement-errors"> 
    <% if @movement.errors.any? %> 
     <%= render partial: 'movements/movement_error_messages' %> 
    <% end %> 
    </div> 
    <div class="field"> 
    <%= f.label :quantity %> 
    <%= f.text_field :quantity %> 
</div> 
<div class="actions"> 
    <%= f.submit %> 
</div> 
<% end %> 

<% if @movement.errors.any? %> 
    <div id = "error_explanation"> 
    <div class = "alert alert-danger"> 
     The form contains <%= pluralize(@movement.errors.count, "error") %>. 
    </div> 
    <ul> 
     <% @movement.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
    </ul> 
    </div> 
<% end %> 

私は空の数量を送信すると、私はエラーメッセージがでレンダリングしたいです同じページ。現時点では、空のフォームを送信すると、フォームがあり、更新ボタンがあるMovements#新しいページにリダイレクトされます。私は有効か無効のいずれかのデータを提出し、それが同じページに扱うことがしたい

class MovementsController < ApplicationController 
    before_action :load_portfolio_and_position 

    def create 
    @movement = Movement.new(movement_params) 
    @movement.position_id = @position.id 
    @movement.update_price 
    @movement.date = DateTime.now 
    @movement.trade ='buy' 

    respond_to do |format| 
     if @movement.save 
     @position.update_attribute(:quantity, (@movement.quantity + @position.quantity)) 
     format.html { redirect_to @portfolio, notice: 'Movement was successfully created.' } 
     format.js 
     else 
     format.html { render :new } 
     format.json { render json: @movement.errors, status: :unprocessable_entity } 
     format.js 
     end 
    end 
    end 

マイ運動コントローラが同じように構築されています。

答えて

0

部分変数を作成するときにローカル変数を使用します。これは、彼らが本当に再利用可能と便利になり:

# app/views/shared/_errors.html.erb 
<% if object.errors.any? %> 
    <div id = "error_explanation"> 
    <div class = "alert alert-danger"> 
     The form contains <%= pluralize(object.errors.count, "error") %>. 
    </div> 
    <ul> 
     <% object.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
    </ul> 
    </div> 
<% end %> 

これは、私たちが好き、それをレンダリングすることができます意味:

<%= render 'shared/errors', object: @movement %> 

私はちょうど有効または無効のいずれかのデータを提出し、それが同じに扱うことがしたいですページ。

Railsの動作と正当な理由はありません。フォームを送信してフォームが無効な場合は、ユーザーが問題を修正できるようにエラーメッセージとフォームを表示するビューをレンダリングします。

リダイレクトすると、ユーザーが入力したデータが問合せ文字列に格納されます。問合せ文字列には、安全性が低く、RESTに違反する方法でセッションを使用する必要があります。

format.html { render :new } 

コントローラで新しいアクションを呼び出さない。単に/movements/new.html.erbのビューを探してレンダリングします。

もちろん、他のビューをレンダリングすることもできます。 render template: 'foo/bar'のように。

+0

私は変更を加えましたが、ポートフォリオフォームページで動きのために空のフォームを提出すると、 –

+0

'nil'はActiveModel互換オブジェクトではありません。 to_partial_pathを実装する必要があります。 –

+0

は、ショーページの<%= render @positions%>を強調表示します。 –

関連する問題