【问题标题】:ruby on rails create new entryruby on rails 创建新条目
【发布时间】:2014-12-20 23:20:57
【问题描述】:

我有一个使用 Ruby on Rails 开发的 Web 应用程序,我的所有 CRUD 操作都运行良好。当我创建一个新项目时,会显示一个新表单,我可以填写新项目的所有字段。

由于多个项目有很多相同的字段,我想添加一个像“复制”这样的操作,以便我可以从现有项目创建一个新项目,所有表单条目都相同,那么我只需对新项目进行一些小改动并在数据库中更新它。

这是我的行为

class ProjectsController < ApplicationController

# GET /projects/1
# GET /projects.1.json
def index
  @projects = Project.all

  respond_to do |format|
    format.html # index.html.erb
    format.json { render :json => @projects }
  end
end

# GET /projects/1
# GET /projects/1.json
def show
  @project = Project.find(params[:id])

  respond_to do |format|
    format.html # show.html.erb
    format.json { render :json => @project }
  end
end

# GET /projects/new
# GET /projects/new.json
def new
  @project = Project.new

  respond_to do |format|
    format.html # new.html.erb
    format.json { render :json => @project }
  end
end

# GET /projects/1/edit
def edit
  @project = Project.find(params[:id])
end

# POST /projects
# POST /projects.json
def create
  @project = Project.new(params[:project])

  respond_to do |format|
    if @project.save
    format.html { redirect_to @project, :notice => 'Project was successfully created.' }
      format.json { render :json => @project, :status => :created, :location => @project }
    else
      format.html { render :action => "new" }
      format.json { render :json => @project.errors, :status => :unprocessable_entity }
    end
  end
end

# POST /projects/1
# PUT /projects/1.json
def update
  @project = Project.find(params[:id])

  respond_to do |format|
    if @project.update_attributes(params[:project])
      format.html { redirect_to @project, :notice => 'Project was successfully updated.' }
      format.json { head :ok }
    else
      format.html { render :action => "edit" }
      format.json { render :json => @project.errors, :status => :unprocessable_entity }
    end
  end
end

# DELETE /projects/1
# DELETE /projects/1.json
def destroy
  @project = Project.find(params[:id])
  @project.destroy

  respond_to do |format|
    format.html { redirect_to projects_url }
    format.json { head :ok }
  end
end
end

在这种情况下,我的“复制”或“复制”操作会是什么样子?

【问题讨论】:

    标签: ruby-on-rails ruby model-view-controller methods


    【解决方案1】:

    我会尝试这样的事情:

    # in the routes.rb
    resources :projects do
      get 'dublicate', :on => :member
    end
    

    这允许您在如下视图中建立指向重复操作的链接:link_to('duplicate', dublicate_project_path(@project))

    # in the controller
    def dublicate
      existing = Project.find(params[:id])
      @project = existing.dup
    
      respond_to do |format|
        format.html { render :new } 
        format.json { render :json => @project }
      end
    end
    

    这会将现有项目的属性(没有 id 字段)复制(参见:http://apidock.com/rails/ActiveRecord/Core/dup)到一个新项目中,然后显示带有预填充字段的新页面。

    【讨论】:

    • 这与我的回答有何不同?我建议使用model.attribtues
    • 将我的答案改为dup。似乎更合适。顺便提一句。正如您所指出的,我没有复制您的答案。我们几乎同时回答。
    • 谢谢@spickermann。我试过这个,它抛出了这个错误“私有方法`initialize_dup'调用#<0x007f895b68f880>
    【解决方案2】:

    这样的事情怎么样:

    def duplicate
      old_project = Project.find(params[:id])
      attributes = old_project.attributes.except(:id, :created_at, :updated_at)
      @project = Project.new(attributes)
      render :new
    end
    

    或许:

    def duplicate
      old_project = Project.find(params[:id])
      attributes = old_project.attributes.except(:id, :created_at, :updated_at)
      @project = Project.new(attributes)
      if @project.save
        redirect_to project_path
      else
        render :edit
      end
    end
    

    请注意,如果您使用strong_params,您可能必须单独分配参数以防止出现禁止属性错误。

    正如 cmets 中指出的那样,您

    【讨论】:

    • 哇。您是否打算复制idcreated_atupdated_at 字段?不知道Project 模型验证/uniq 索引是不可能回答的。
    • @Mohamad :第一个解决方案对我来说效果很好。非常感谢!
    猜你喜欢
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2013-04-29
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    相关资源
    最近更新 更多