不明白如何实现简单的表单创建动作

时间:2014-02-27 00:48:08

标签: ruby-on-rails forms model-view-controller ruby-on-rails-3.2 simple-form

注意:我正在使用Rails 3.2

我正在尝试按照以下示例代码实现simple_form:https://github.com/rafaelfranca/simple_form-bootstrap/blob/master/app/controllers/articles_controller.rb。我有一个摘要模型而不是文章模型。

除了两个私有方法之外,我理解大部分内容。我尝试基本上复制除了两个私有方法之外的代码,它的作用是创建一个新的Summary,但属性都是nil。

1)如何保存属性? .new.save之间的区别是什么?

2)创建动作有哪些内容?当你到达创建动作时,你刚刚填写了一个表格,所以必须有一些东西可用,但我不知道它是什么,或者它是如何可用的。

3)before_action和两种私有方法发生了什么?

Summaries Controller

class SummariesController < ApplicationController
    before_filter :set_summary, only: [:show, :edit, :update, :destroy]

    def index
        @summaries = Summary.all
    end

    def show
    end

    def new
        @summary = Summary.new
    end

    def edit
    end

    def create
        @summary = Summary.new(params[:summary])

        if @summary.save
            redirect_to @summary, notice: 'Summary created.'
        else
            render :new
        end
    end


    def update
        if @summary.update(params[:summary])
            redirect_to @summary, notice: 'Summary updated.'
        else
            render :edit
        end 
    end

    def destroy
        @summary.destroy
        redirect_to summaries_url, notice: 'Summary destroyed'
    end

    private
        # sets @summary to make available for show, edit, update 
        # and destroy actions so code isn't repetitive
        def set_summary
          @summary = Summary.find(params[:id])
        end

        # Only allow a trusted parameter "white list" through.
        # def summary_params
        #  params[:summary].permit!
        #end

end

1 个答案:

答案 0 :(得分:1)

回答你的问题:

1)new是一个Ruby方法,用于初始化对象的新实例。因此,当您致电Article.new时,您会获得Article类的新实例。

save是一种用于将记录保存到数据库的Rails方法。如果您的对象实例使用new进行实例化,则会调用create。如果您通过查找程序(findallwhere等)加载了对象,那么它会调用update而不是create

2)所有操作(以及视图中)都有一个名为params的哈希。对于create操作,params[:article],这是表单发布的数据。在create的顶部,尝试拨打raise params[:article].to_yaml以查看其中发生的情况。

哎呀,甚至试试raise params.to_yaml来看看那里有什么。

3)对before_action的调用会在set_articleshoweditupdate操作之前运行destroy私有方法。如果没有这个,您需要在每个操作中手动调用@article = Article.find(params[:id])。所以这消除了相当多的重复!

您会注意到create操作的第一行调用了article_params方法。这是在Rails中实现所谓的强参数的常用方法。强参数是Rails 4中的新参数,但可以通过strong_parameters gem添加到早期版本的Rails中。