Кнопка rsvp (пользователи могут только rsvp один раз) - PullRequest
0 голосов
/ 21 мая 2018

Таким образом, в настоящее время пользователи могут использовать rsvp несколько раз для одного и того же события.Это очевидно проблематично для моего сайта, поэтому я хочу, чтобы один пользователь мог только один раз rsvp для определенного поста / события.После того, как они сделали свой Rsvp, я хочу, чтобы кнопка rsvp исчезла.Вот как выглядит мой код.

show.html.erb

id="notice"><%= notice %></p>


<p>
  <strong>Date:</strong>
  <%= @post.date %>
</p>

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

<p>
  <strong>User_id:</strong>
  <%= @post.user_id %>
</p>
<p><strong>Address:</strong> <%= @post.address %></p>
<p>
  <strong>Description:</strong>
  <%= @post.description %>
</p>

<p>
    <strong>registered:</strong>
    <%=@post.users.length%>
</p>






<% if current_user == @post.user %>
 <%= link_to 'Edit', edit_post_path(@post) %> |
<%end%>
 <%= link_to 'Back', posts_path %>

<div class="rsvp"><%= button_to "Rsvp now", rsvps_post_path(@post), class: "btn btn-primary" %></div>





<div class="map"><%= image_tag "http://maps.googleapis.com/maps/api/staticmap?center=#{@post.latitude},#{@post.longitude}&markers=#{@post.latitude},#{@post.longitude}&zoom=12&size=450x400&sensor=false&key=AIzaSyCKzKMEhSNgwSXf7WV71pHWgzdpMkPn8W4",
class: 'img-fluid img-rounded', alt: "#{@post} on the map"%>
</div>

post.rb

class Post < ApplicationRecord
belongs_to :user
 geocoded_by :address
after_validation :geocode, if: ->(obj){ obj.address.present? and obj.address_changed? }
reverse_geocoded_by :latitude, :longitude
after_validation :reverse_geocode


  has_many :rsvps
  has_many :users, through: :rsvps

  validates :name, presence: true

user.rb

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
         has_many :posts

          has_many :rsvps
          has_many :posts, through: :rsvps

          validates :email, presence: true

rsvp.rb

class Rsvp < ApplicationRecord
  belongs_to :user
  belongs_to :post
end

# rsvp миграция

class Rsvp < ApplicationRecord
  belongs_to :user
  belongs_to :post
end

Итак, я посмотрел в Stackoverflow и немного погуглил, но я в растерянности.Буду очень признателен за ответ, который решит эту проблему.Я просто хочу, чтобы кнопка rsvp показывала пользователей, которые не rsvped для определенного сообщения / события.

1 Ответ

0 голосов
/ 22 мая 2018

Самым важным для меня является ограничение базы данных.Вы хотите дать указание базе данных выдавать ошибку в этих случаях.

В миграции

add_index :rsvps, [:user_id, :post_id], unique: true

И подтверждение, отражающее это, просто чтобы рельсы знали об этом

validates :user_id, uniqueness: { scope: :post_id }

Теперь мы уверены, что в базе данных присутствует не более одной пары some_user_id, some_post_id.

Теперь давайте проинструктируем представление не отображать кнопку в этих случаях

<% unless Rsvp.exists?(post: @post, user: @post.user) %>
  <div class="rsvp">
    <%= button_to "Rsvp now", rsvps_post_path(@post), class: "btn btn-primary" %>
  </div>
<% end %>

Я бы переместил существующий запрос в действие и использовал бы здесь только логическое значение, это просто демонстративно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...