【问题标题】:dup or clone action in railsrails 中的 dup 或 clone 动作
【发布时间】:2019-02-25 02:23:26
【问题描述】:

我会澄清我正在做的事情

class DuplicatesController < ApplicationController
  before_action :set_venue, only: [:new]

  def new
  end

  def create
    if @venue.duplicate(venue_params)
      flash[:success] = t('controller.create.success',
                          resource: Venue.model_name.human)
      redirect_to admin_venue_url @venue
    else
      flash[:warning] = @venue.errors.full_messages.to_sentence
      render :new
    end
  end

  private
  def set_venue
    @venue = Venue.friendly.find params[:venue_id]
  end
end

def venue_params
  params.require(:venue).permit(:name,
                                :address,
                                :address_complement,
                                :city,
                                :phone)
end

结束

定义重复

(名称, 地址, 地址补全, 城市, 电话)

new_venue = self.dup
new_venue.update_attributes(description: self.description,
                            logo: self.logo,
                            opening_time: self.opening_time,
                            closing_time: self.closing_time,
                            ally_id: self.ally_id)
new_venue.save

结束

如何在我的副本控制器中调用这些参数,谢谢 我需要在创建 dup 后设置属性,因为我想用新信息保存一条新记录,但我不知道用我的方法来做,有人可以解释一下 谢谢。

【问题讨论】:

  • 能否请您澄清您的问题或添加更多详细信息?您是否正在尝试创建一个与 VenueController 具有完全相同操作的单独控制器?您不能将参数从一个控制器传递到另一个控制器,参数是从 HTTP 请求中提取的。
  • 谢谢,是的,现在我在模型场地 def duplicate(params) new_venue = self.dup new_venue.attribute = params new_venue.save end 但在控制器中我从一个变量调用 method.duplicate

标签: ruby-on-rails controller clone dup


【解决方案1】:

可能最好的方法是只传递原始模型的 id/slug。

那么你的 duplicates_controller.rb 可能看起来像这样:

class DuplicatesController < ApplicationController
  def create
    old_venue = Venue.friendly.find(params[:id])
    venue = old_venue.dup
    venue.attributes = venue_params
    if venue.save
      # success render
    else
      # error render
    end
  end

  private 

  def venue_params
    params.require(:venue).permit(:permitted_attributes) # id should not be there
  end
end

当然你可以重构它,但我认为在这种情况下不需要它。

或者我最喜欢的是将 VenueController#create 更改为这样的内容,以允许从另一个实例创建:

if copy_from_id = params[:copy_from_id]
  @copy_source = Venue.find_by(id: copy_from_id)
  @venue = @copy_source.dup
  @venue.attributes = venue_params
else
  @venue = Venue.new
end

if @resource.save
  ...
else
  ...
end

【讨论】:

  • 谢谢,但我只想从场地传递一些参数,并且我从 Venue.model 验证了名称是唯一性的,然后在我创建 .dup 并存储在新变量中之后,我需要设置新属性,我该怎么做。
  • 谢谢,@DonPaulie 现在当我尝试分配场地.attributes = 场地参数时,我总是有同样的错误 undefined local variable or method `venue_params' for #<:duplicatescontroller:0x00007fc5fd0e1968>意思是?场地路径
  • 表示你没有定义方法venue_params。确保第一个代码块的最后几行在那里。
猜你喜欢
  • 2012-02-01
  • 1970-01-01
  • 2015-07-17
  • 1970-01-01
  • 2018-08-16
  • 2012-04-28
  • 1970-01-01
  • 2016-06-11
  • 2013-04-18
相关资源
最近更新 更多