在我的创建动作中,方法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
答案 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)
使用ActiveRecord类create = new + save
答案 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