新的行为就像创造

时间:2012-05-07 11:55:13

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

在我的创建动作中,方法new就像创建一样。

def create
  @page = Page.new(params[:page].merge(:user_id => current_user.id ))
  if @page.save
    flash[:notice] = t("success")
    redirect_to pages_path
  else
    render :new
  end
end

ActiveRecord在数据库中创建新对象,而我在使用params时使用new。 Page.new在我的控制器中的新操作中工作正常。可能是什么原因?在我的模型中没有重写的方法new和没有回调(before_save,before_create等)。任何帮助将不胜感激。

UPDATE - 来自调试器的代码

.../app/controllers/pages_controller.rb:48
@page = Page.new(params[:page].merge(:user_id => current_user.id ))
(rdb:25) @page
nil
(rdb:25) n
.../app/controllers/pages_controller.rb:49
if @page.save
(rdb:25) @page
#<Page id: 80 ... >
(rdb:25) Page.last
#<Page id: 80 ... >
(rdb:25) @page.save
false

4 个答案:

答案 0 :(得分:2)

检查我的内联评论..

 def create
  @page = Page.new(params[:page].merge(:user_id => current_user.id )) # you trigger new thats fine..
  if @page.save # Notice here.. This line is triggering query on database.
    flash[:notice] = t("success")
    redirect_to pages_path
  else
    render :new
  end
end

答案 1 :(得分:0)

原因(模型中可以改变工作流程状态的方法):

def status=(state_name)
  states = [self.current_state.to_sym]
  possible_states.each {|t| states<< t[1]}
  unless state_name.blank?
    if states.include? state_name
    process_event! state_name
    end
  end
end

丑陋的修复

def create
  @page = Page.new
  if @page.update_attributes(params[:page].merge(:user_id => current_user.id )) && @page.save
    flash[:notice] = t("success")
    redirect_to pages_path
  else
    render :new
  end
end

错误很愚蠢,我并不为我的解决方案感到骄傲。无论如何,谢谢你的帮助:)

答案 2 :(得分:-1)

答案 3 :(得分:-1)

您的控制器代码是正确的。这就是“创建”控制器方法应该如何工作的方式。问题不在那里。

您确定要创建两个模型吗?

您使用属性调用的.new方法会在未保存的内存中创建一个activerecord对象。 .save方法保存它。最后(假设数据有效),你应该在内存中有一个对象。

如果您创建了两个对象,则表示存在问题。如果你只有一个,那就应该是它。

您是否拥有此控制器方法创建的第二个对象?

这个过程应该是:

# when GET /student/new is called, this returns an empty object to display in the form
# for the user to see.
def new
  @page = Page.new
end

# When POST /page is called, the form params are passed in here.
def create
  # First, generate a new page object with the params passed in.
  @page = Page.new(params[:page].merge(:user_id => current_user.id ))
  # Now try save the object to persist it in the database.
  if @page.save
    flash[:notice] = t("success")
    redirect_to pages_path
  else
    render :new
  end
end