0

在我的创建操作中,方法 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 在数据库中创建新对象。Page.new 在我的控制器中的新操作中运行良好。可能是什么原因?在我的模型中没有重写方法 new 和回调(before_save、before_create 等)。任何帮助,将不胜感激。

更新 - 来自调试器的代码

.../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

4 回答 4

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
于 2012-05-07T12:01:23.087 回答
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

错误非常愚蠢,我并不为我的解决方案感到自豪。无论如何,谢谢你的帮助:)

于 2012-05-07T12:58:39.657 回答
-1

使用 ActiveRecord 类,create = new + save

https://github.com/rails/rails/blob/7edade337e968fb028b2b6abfa579120eb424039/activerecord/lib/active_record/persistence.rb#L40

于 2012-05-07T12:01:47.103 回答
-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
于 2012-05-07T12:16:42.460 回答