0

私はこれを尋ねる必要があるとは思いませんでしたが、ここに行きます。たとえば、本のチェックアウト、チェックイン、リマインダーの設定を可能にするアプリがあります。これは、check_boxをクリックすることで実行できます。したがって、たとえばUser1がBook1をチェックアウトした場合、そのユーザーは表示時にのみチェックインボタンを表示できます。そして、同じユーザーがその本をチェックインすると、チェックアウトボタンが再び表示されます

次にuser2が来ます。彼らは同じ本を表示し、理論的にはuser1によるremind meボタン(これは本がチェックインされたときに電子メールを送信します)以外のボタンを表示できないはずです。

ただし、現在の設定では、user2にはチェックアウトボタンが表示されますが、trueと表示されています。これはステータスの観点からは正しいですが、そのボタンを表示したくありません。

これは私がこれまでに持っているものです(通知ボタンのロジックは何もレンダリングしません)

<% unless current_user.id == @book.user_id   %> 
<%= render 'shared/checkout' %>
<% end %>

<% if current_user.id == @book.user_id %>
<%= render 'shared/checkin' %>
<% end %>

<% if @book.user_id != nil && current_user.id != @book.user_id %>
<% render 'shared/registerinterest' %>
<% end %>

また、ユーザーが本をチェックインすると、これがモデルに渡されます。nil値が問題を引き起こしている可能性があると考えていましたか?

<%= form_for @book do |f| %>

<%= f.label :checked_out, "Check Book Back In" %>
<%= f.check_box :checked_out, {checked: false}, false  %>
<%= f.hidden_field :user_id, :value => nil %>
<%= f.submit 'Check In' %>
<% end %>

カントはこのシナリオに頭を悩ませているようです。誰かがその理由を説明できれば、それから学ぶことができるので、それは素晴らしいことです。

ありがとうございました

編集

私は今anserに基づいて登録ボタンのためにこれを試しています

<% if @book.checked_out == true && current_user.id != @book.user_id %>
<% render 'shared/registerinterest' %>
<% end %>

しかし、これは機能していませんか?

4

1 に答える 1

2

良い、

コード <% unless current_user.id == @book.user_id %>

以下と同じです: <% if current_user.id != @book.user_id %>

したがって、user2 の ID は 2 であるため、実際にはユーザーの ID (つまり 1 ) とは異なり、チェックアウトのパーシャルが表示されます。

私の提案は、本がチェックアウトされたかどうかを知らせるブール値フィールドをデータベースに追加することです。

<% if current_user.id == @book.user_id %>
   <%= render 'shared/checkin' %>
<% elsif @book.checked_out == false %>
   <%= render 'shared/checkout' %>
<% else %>
    #If it goes into this branch of the if/elsif/else, it means that
    # current_user.id != @book.user_id and checked_out == true
    <%= render 'shared/registerinterest' %>
<% end %>

そして、誰かが本をチェックアウトしたときに checked_out を true に設定する何かを実装する必要があります。

編集済み:最後の他のものを含めました。

于 2013-01-07T14:00:51.720 に答える