我有一个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
答案 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 %>
在您的表单上