2013-07-08 106 views
0

在本指南:Ruby on Rails的結合形式對象

http://guides.rubyonrails.org/v2.3.11/form_helpers.html#binding-a-form-to-an-object

在部分2.2 Binding a Form to an Object我看到了這一點:

<% form_for :article, @article, :url => { :action => "create" }, :html => {:class => "nifty_form"} do |f| %> 
    <%= f.text_field :title %> 
    <%= f.text_area :body, :size => "60x12" %> 
    <%= submit_tag "Create" %> 
<% end %> 

我得到的形式是這樣的:

<form action="/articles/create" method="post" class="nifty_form"> 
    <input id="article_title" name="article[title]" size="30" type="text" /> 
    <textarea id="article_body" name="article[body]" cols="60" rows="12"></textarea> 
    <input name="commit" type="submit" value="Create" /> 
</form> 

所以控制器方法create應該執行並且@action應該從表單序列化到它。所以,我需要聲明與像一些參數創建:

def create(action) 
action.save! 
end 

要不我怎麼會得到操作對象的保持這是我從形式發送的控制方法創建

回答

1

所有形式的值傳遞給方法作爲散列。該title場爲params[:article][:title]過去了,body作爲params[:article][:body]

所以在你的控制器,你需要創建這些PARAMS新Article。請注意,你不參數傳遞給create方法:

def create 
    @article = Article.new(params[:article]) 
    if @article.save 
    redirect_to @article 
    else 
    render 'new' 
    end 
end 
0

讓創建方法保存你的對象,你只需要傳遞參數給新的對象,比保存

def create 
Article.new(params[:article]).save 
end 

現實方法可能會更加困難與重定向respond_to塊等...

1

在這裏,@article是您的對象的文章模型。

<form action="/articles/create" method="post" class="nifty_form"> 

這種形式的行動是"/articles/create",這意味着一旦提交表單,所有的表單數據將被張貼創建文章控制器的作用。在那裏,你可以通過params來獲取表單數據。

因此,在您創建行動

def create 
    # it will create an object of Article and initializes the attribute for that object 
    @article = Article.new(params[:article]) # params[:article] => {:title => 'your-title-on-form', :body => 'your body entered in your form'} 

    if @article.save # if your article is being created 
    # your code goes here 
    else 
    # you can handle the error over here 
    end 
end 
0

能做到這一點通過PARAMS。

def create 
    @article = Article.new(params[:article]) 
    @article.save! 
    redirect_to :action => :index #or where ever 

rescue ActiveRecord::RecordInvalid => e 
    flash[:error] = e.message 
    render :action => :new 
end