2012-05-07 4 views
0

私の作成アクションでは、メソッド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 

ActiveRecordは新しいオブジェクトをデータベースに作成しますが、新しいものはparamsで使用しています。 Page.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

dude page.saveがそのことを引き起こしています:P –

+0

「Page.new」を呼び出してデータベースに新しいレコードを作成する方法を知っていますか? page.save'。 '@ page.save'はデータベースに新しいレコードを作成します。これは何が起こっているのですか?このコードで何をしたいですか? – rubyprince

+0

私のモデルにバリデーションがあるので、失敗した場合、@ page.saveはfalseを返し、アプリケーションはアクションnewをレンダリングします。確かに、Page.new(params [:page] .merge(:user_id => current_user.id))はデータベースにレコードを保存しています - デバッガで見つけました – zachar

答えて

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

お使いのコントローラコードが正しいか、ActiveRecordのクラスで

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 
+0

検証が失敗した場合、@ page.saveはfalseを返します。したがって、オブジェクトはデータベースに保存されません。 objectが有効な場合、コードは機能します。私はそれが私の問題のための適切な解決策ではないと思います。 – zachar

+0

@zacharあなたのモデルが持つものを私に見せてください。 –

-1
+0

これは@ page.createであり、コントローラに 'create'メソッドを持たないでしょう。この回答は間違っているようです。 –

+0

? OPはコントローラーメソッドではなく、ARモデルメソッドについて話しています。 –

+0

ああ - 私は今あなたが意味するものを見る。私はOPが@ page.createを使用しているべきであることを暗示していると思った。私は誤解しました。 –

-1

を私のインラインコメントを確認してください。これは、「作成」コントローラメソッドがどのように機能すべきかです。問題はそこにありません。

2つのモデルが作成されていることは確かですか?

属性を使用して呼び出している.newメソッドは、未保存のメモリにactiverecordオブジェクトを作成します。 .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 
+0

新しいオブジェクトが実際にオブジェクトを作成していた場合、別のオブジェクトを作成することはできませんでした。 @pageは常に同じオブジェクトを指します。 –

+0

@ビーリントン私はOPが、彼が2つのオブジェクトを保存していると言っていることを理解していました - 新しいものと1つを保存しました。たぶん私は誤解しました。 –

+0

@ Beelingtonあなたが私の答えを読んだら、それは100%正しいです。私はなぜdownvoteがわかりません - あなたは精緻化することができますか? –

関連する問題