Альтернативный подход использует объект политики , Вот как я мог бы это сделать, используя Pundit.
Обновлено:
приложение/модели/post.rb
class Post < ActiveRecord::Base
belongs_to :user
def self.limit_exceeded?(max = 100)
count >= max
end
end
приложение/модели/user.rb
class User < ActiveRecord::Base
has_one :post
end
приложение/политика/post_policy .rb
class PostPolicy < ApplicationPolicy
def create?
!user_has_post? && space_to_post?
end
private
def user_has_post?
user.post.present?
end
def space_to_post?
!Post.limit_exceeded?
end
end
приложение/контроллеры/posts_controller.rb
class PostsController < ApplicationController
def show
@post = Post.find(params[:id])
end
def new
@post = Post.new
end
def create
authorize(:post)
@post = current_user.build_post(post_params)
if @post.save
redirect_to @post, notice: "Your post was created!"
else
render :new
end
end
private
def post_params
params.require(:post).permit(:message)
end
end
приложение/просмотр/сообщений/new.html.erb
<% if policy(:post).create? %>
<%= form_for(@post) do |form| %>
<%= form.text_area :message %>
<%= form.submit "Post" %>
<% end %>
<% else %>
You cannot post.
<% end %>
Этот код предполагает, что проверка подлинности пользователя , Если вы не включили аутентификацию, вам нужно использовать камень для этого или сверните свою собственную реализацию. Я бы рекомендовал Devise или Clearance.
Удачи вам!
Помогла ли вам хоть один из ответов? –