2017-12-13 3 views
2

は、だから、私は、ビュー_form.erbでこれを持っている:NoMethodErrorコントローラでビューをレンダリング後

<div class="form-group"> 
    <%= f.label :start_hour %><br> 
    <%= f.select :start_hour, @select_hours.map {|value| [value, value]} %> 
</div> 

をそしてedit.erbでこの:私のコントローラで

<%= render 'form' %> 

そして、この

def edit 
     @user = current_user 
     @employee = @user.employee 
     @hour = @employee.working_hours.find(params[:id]) 
     @select_hours = Array.new 
     for i in 0..12 
      @select_hours.push("#{07+i}:00") 
      @select_hours.push("#{07+i}:30") 
     end 
    end 

私のコントローラで私の更新

def update 
    @employee = current_user.employee 
    @hour = @employee.working_hours.find(params[:id]) 
    if @hour.update(working_hour_params) 
     redirect_to employee_working_hours_path(@employee) 
    else 
     render :edit 
    end 
end 

そして、ここに私の問題だ:

私は、更新をクリックして、間違ったstart_hourを持っている(カスタム検証、編集していないを作成するときに動作します)、その@hourは更新されません。このビューをもう一度レンダリングしますが、nilの場合はmapというメソッドはありません(したがっての場合)。

どうすればこの問題を解決できますか?

答えて

1

アップデートが失敗した場合は、値が存在することになる、あなたのコントローラでコールバックし、これらの二つの動作のためにを設定し、この方法を使用することができますが、同じように、二回変数を割り当てる必要はありません。

before_action :set_select_hours, only: %i[edit update] 
before_action :set_employee,  only: %i[edit update] 
before_action :set_hour,   only: %i[edit update] 

def edit; end 

def update 
    if @hour.update(working_hour_params) 
    redirect_to employee_working_hours_path(@employee) 
    else 
    render :edit 
    end 
end 

private 

def set_select_hours 
    @select_hours = (0..12).flat_map do |index| 
    ["#{07 + index}:00", "#{07 + index}:30"] 
    end 
end 

def set_employee 
    @employee = current_user.employee 
end 

def set_hour 
    @hour = @employee.working_hours.find(params[:id]) 
end 

@employeeはbeforeコールバック内に設定することもできます。

フラットマップを追加して、範囲から始まる配列を作成して塗りつぶしました。これは以前と同じですが、配列を初期化する必要はなく、forループを使用してそれ。

+0

あなたは '@select_hours.map {| value | [value、value]} 'となりますが、select_hoursを宣言する瞬間に行うこともできます。 –

+0

よく私はform_forで時間を選択するためにそれを使用し、私はstackoverflow ^^でこのメソッドを見つけたが、とにかくそれは完璧に働いた応答のために感謝!そして、あなたのおかげで、私はコールバックを使用して開始します:) – proofexak

+0

ああ、私はこれを忘れて、申し訳ありません。まあ、あなたは@hourについて正しいのですが、私のコントローラーはちょっと空いていますが、全体的にはf * ckのように素晴らしいです。助けを求めてくれてありがとう! – proofexak

関連する問題