如何将消息选项添加到validates_uniqueness_of:user_id,:scope => :Rails模型中的task_id?

时间:2016-03-16 00:27:42

标签: ruby-on-rails validation models

我有一个Rails模型DoRequest。

class DoRequest < ActiveRecord::Base
include AASM
default_scope -> { order('created_at DESC') }
belongs_to :task
belongs_to :user
validates_uniqueness_of :user_id, :scope => :task_id, :message =>"Your application cannot be processed"
aasm :column => 'state', :whiny_transitions => false do
state :pending
state :accepted
state :rejected
event :accept do
  transitions :from => :pending, :to => :accepted
end
event :reject do
  transitions :from => :pending, :to => :rejected
end  
end  
end

我使用范围添加了唯一性验证,因为我希望模型的每个实例都具有唯一的user_id和task_id组合。

现在添加了验证我每次尝试创建具有相同值[:user_id,task_id]的新DoRequest实例时都会收到错误。

错误表示nil的未定义方法`id':行中的NilClass:

undefined method `id' for nil:NilClass in the line:

  <%= form.hidden_field :task_id, value: @task.id %>
app / views / do_requests / new.html.erb中的

<%= form_for @do_request, method: :post do |form| %>
<div class= "form form-actions" >    
<%= form.hidden_field :task_id, value: @task.id %>
<%= form.label :application, "Please write your application here and the project administrator will get back to you" %><br>
<%= form.text_area :application, :rows => 20, :cols => 60 %>
<% if params[:free] == 'true' %>
<%= form.hidden_field :free, value: true %>
<%elsif params[:free] == 'false' %>
<div class="checkbox" style="width:150px">
<label>
<%= form.check_box :free %> Do for free
</label>
</div>
<%end%>
<%= submit_tag "Send Application", class: 'btn btn_primary' %>
<%= link_to "Cancel", task_path(@task), class: 'btn' %>
</div>
<%end%>

我希望错误地将用户重定向并显示消息:“您无法对同一任务应用两次”。

我该怎么做。

Here is my controller:

 class DoRequestsController < ApplicationController
 before_filter :authenticate_user!

 def index
 end

 def new
 @task = Task.find(params[:task_id])
 @free = params[:free]
 end

 def create
 @do_request = current_user.do_requests.build(request_params)
  if @do_request.save
    flash[:success] = "Request sent to Project Admin"
  redirect_to @do_request.task
  else
  render 'new'
  end
  end

 def update
 end

def destroy
@do_request = DoRequest.find(params[:id])
 @do_request.destroy
respond_to do |format|
  format.html { redirect_to current_user, notice: 'Task assignment request was successfully destroyed.' }
  format.json { head :no_content }
end
end

def accept
 @do_request = DoRequest.find(params[:id])
 if @do_request.accept! 
  @do_request.user.assign(@do_request.task, @do_request.free)  
   flash[:success] = "Task has been assigned"
 else
  flash[:error] = "Task was not assigned to user"
   #assign(@do_request.user, @do_request.task, @do_request.free)
    end
  end

 def reject
 @do_request = DoRequest.find(params[:id])
 if @do_request.reject!
  flash[:succes] = "Request rejected"
 else
  flash[:error] = "Was not able to reject request"
 end
 end
 private 
 def request_params
  params.require(:do_request).permit(:application, :task_id, :user_id, :free)
 end 
end

1 个答案:

答案 0 :(得分:0)

在你的def创建

上使用它
def create
 @do_request = current_user.do_requests.build(request_params)
    if @do_request.save
        flash[:success] = "Request sent to Project Admin"
      redirect_to @do_request.task
    else
      @task = Task.find(params[:do_request][:task_id])
      @free = params[:free]
      render 'new'
    end
end

或只是使用

<%= form.hidden_field :task_id %>

在您的表单上