如何创建控制器操作/方法(最佳实践/通用语言)

时间:2014-03-24 02:42:06

标签: ruby-on-rails ruby-on-rails-3 model-view-controller controllers

我对滚动和编程很新。我觉得我已经很好地掌握了MVC和其他概念,但仍然很难弄清楚控制器动作的语法。例如,当您创建

def edit

end

您如何知道如何格式化该方法的内容/内部。

到目前为止,我已经看到了很多这样的事情:

def new
  @product = Product.new
end

如果我理解正确的话,那就是创建一个产品模型的实例,并将其放入一个可以通过products / view中的“new”视图访问的实例变量

但是,我想说我想编辑它。我倾向于在控制器中添加以下操作:

def edit
  @product = Product.edit
end

我不确定语法Product.edit是否正确,但不确定如何区分编辑和更新。在创建实例变量时,如何知道对模型对象的调用?在网上有什么我可以去学习吗?到目前为止,我找不到任何可以使用的命令列表。

2 个答案:

答案 0 :(得分:1)

def edit
  @product = Product.edit
end

应该是

def edit
  @product = Product.find(params[:id])
end

简单的解释

调用e.q localhost:3000/products/1/edit

时会调用编辑操作(#method)

1是您的产品的ID,传递给您的控制器,可以使用参数访问。

当用户点击编辑时。它通常会将数据发送到更新操作

def update
  @product = Product.find(params[:id])
  @product.update(params[:product].permit(:title, :desc))
end

好的,我知道我的解释不够好。你真的需要阅读这个

http://guides.rubyonrails.org/

答案 1 :(得分:0)

要编辑某些内容,首先需要拥有(或获取,创建或等等)。在 new 方法中,您只需创建 Product 的新实例,这不是必需的,但需要* form_for * helper,并且通常是很好的做法,因为它可以使用用于创建和编辑的相同表单。 Product.new 只是创建新产品并使用默认值初始化其字段。 Product.find 通过 id 搜索数据库中的产品(单个)并返回它。因此,对于编辑,您首先需要找到您的产品,然后它将用于填写编辑表单中的字段,而不是在 update 方法中您将更新它:

def update
  target_product_required
  @product.assign_attributes(product_params)

  if @product.save
    redirect_to @product
  else
    render :edit
  end
end

def target_product_required
  @product ||= Product.find(params[:id])
end

def product_params
  params.require(:product).permit(:title, :description, :price, :available_quantity, :image, :remote_image_url)
end

这是常见模式:target_product_required返回/分配由params产品到实例变量的id,product_params返回产品指定的参数。有关此内容的更多信息,请参阅http://guides.rubyonrails.org/