控制器操作中的Rails3条件语句

时间:2011-09-07 09:04:43

标签: ruby-on-rails ruby ruby-on-rails-3.1

我正在尝试在我的任务控制器中为简单的rails3应用程序编写一个条件语句。

用户有许多任务,任务只有一个用户。

创建任务时,我们可以选择拥有它的人:

<%= collection_select(:task, :user_id, User.all, :id, :name, {:prompt => true}) %>

我希望系统只有在为其他人创建电子邮件时才向该任务的所有者发送电子邮件。即当我为自己创建任务时,我不需要收到电子邮件。

我的邮件工作正常,在我的任务控制器中,我试过这个:

def create
    @task = Task.new(params[:task])    
    respond_to do |format|
      if @task.save and @task.user_id = current_user.id      
        format.html { redirect_to(tasks_path, :notice => 'Task was successfully created.') }      
        format.xml  { render :xml => @task, :status => :created, :location => @task }        
      elsif @task.save
        format.html { redirect_to(tasks_path, :notice => 'Task was successfully created.') }      
        format.xml  { render :xml => @task, :status => :created, :location => @task }        
        TaskMailer.new_task(@task).deliver      
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @task.errors, :status => :unprocessable_entity }
     end
    end
  end

但它并没有真正起作用......有任何帮助的机会。

4 个答案:

答案 0 :(得分:2)

@task.user_id = current_user.id替换为@task.user_id == current_user.id

这不是导致错误的原因,但如果@task.user_id != current_user.id,您将保存两次任务。你可以这样做:

def create
    @task = Task.new(params[:task])

    respond_to do |format|
      if @task.save
        format.html { redirect_to(tasks_path, :notice => 'Task was successfully created.') }      
        format.xml  { render :xml => @task, :status => :created, :location => @task }        
        TaskMailer.new_task(@task).deliver if @task.user_id != current_user.id  
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @task.errors, :status => :unprocessable_entity }
      end
    end
  end
end

答案 1 :(得分:1)

您是否未存储创作者的ID?如果这样做,您需要的所有数据都在模型中。因此,只需在Task模型中实现私有实例方法。类似于以下内容

# Task model
private

def notify_assignee
  if new_record? || user_id_changed? && creator_id != user_id
    TaskMailer.new_task(@task).deliver
  end
end

调用上述方法after_save

# Task model
after_save :notify_assignee

如果您未将creator_id存储在数据库中,请创建名为:creator_id的属性访问者。

# Task model
attr_accessor :creator_id

在控制器中,在保存之前,执行

# Tasks controller
@task.creator_id = current_user.id

并且上述方法仍然有效。

您的控制器重新指示将自动简化为

 if @task.save
    format.html { redirect_to(tasks_path, :notice => 'Task was successfully created.') }      
    format.xml  { render :xml => @task, :status => :created, :location => @task }        
  else
    format.html { render :action => "new" }
    format.xml  { render :xml => @task.errors, :status => :unprocessable_entity }
 end

这也是正确的方式,因为“业务逻辑”(在您的情况下向受让人发送电子邮件,通知其他人已向其分配任务)将驻留在模特。

答案 2 :(得分:1)

由于这一行,您使用了作业=而不是比较==
此外,current_user应该是@current_user,因为您没有在方法中指定它。 (或者你有一个你没有发布的方法current_user()。那就没关系了)

if @task.save and @task.user_id = current_user.id

应该是

if @task.save and @task.user_id == @current_user.id

另外,你应该将邮件内容移到Task - 模型并使用after_save - 回调。

答案 3 :(得分:0)

也许您需要更改此行:@task.user_id = current_user.id@task.user_id == current_user.id