0

私の create アクションでは、メソッド new は create のように機能します。

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

パラメータで new を使用しているときに、ActiveRecord はデータベースに新しいオブジェクトを作成します。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

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

コントローラコードは正しいです。これは、「create」コントローラーメソッドが機能する方法です。問題はありません。

2つのモデルを作成していると確信していますか?

属性を使用して呼び出している.newメソッドは、保存されていないアクティブレコードオブジェクトをメモリに作成します。メソッドはそれ.saveを保存します。最後に(データが有効であると仮定して)、メモリ内に単一のオブジェクトが必要です。

2つのオブジェクトを作成している場合は、問題があります。1つしかない場合は、本来あるべき姿です。

このコントローラーメソッドによって作成された2番目のオブジェクトがありますか?

プロセスは次のようになります。

# 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 に答える
-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 に答える