Rails3 условных операторов в действиях контроллера - PullRequest
1 голос
/ 07 сентября 2011

Я пытаюсь написать условное утверждение в своих контроллерах задач для простого приложения 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 ]

2 голосов
/ 07 сентября 2011

Заменить @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 голос
/ 07 сентября 2011

Именно из-за этой строки вы используете присвоение = вместо сравнения ==
Также 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 -отзыв.

1 голос
/ 07 сентября 2011

Вы не храните идентификатор создателя? Если вы это сделаете, все данные, которые вам нужны, находятся в модели. Таким образом, просто реализуйте частный метод экземпляра в модели задач. Что-то вроде следующего

# 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 в базе данных, создайте атрибут accesor с именем :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

А также это был бы правильный путь, поскольку «бизнес-логика» (которая в вашем случае отправляет получателю электронное письмо, уведомляющее, что кто-то еще назначил ему задачу ) будет находиться в модель.

0 голосов
/ 07 сентября 2011

Может быть, вам нужно изменить эту строку: @task.user_id = current_user.id на @task.user_id == current_user.id

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