我在数据库中有以下表格,还有为它创建的模型。
|id |name |description |created_date |updated_date |
-----------------------------------------------------------------------
|1 |HELLO |greeting |2017-09-28 18:51:51 |2017-09-28 18:51:51|
model.rb
class Person < ApplicationRecord
has_many :person_activities
validates :name, uniqueness: true
end
我想在控制器中创建update
操作。它将根据传递的名称更新名称和描述。例如,我想将名称 HELLO 更新为 HI 。我该如何为此创建更新操作?
我尝试在控制器中执行update
操作,但它不会点击update
操作
def update
byebug
redirect_to Person.find(name: params[:id]).tap { |person|
person.update!(person_params)
}
end
private
def person_params
params.require(:person).permit(:name)
end
的routes.rb
resources :person, only: [:index, :show, :create, :update, :destroy], defaults: { format: :json }
尝试像http://localhost:1111/person/HELLO
这样的测试,并在身体参数中传递{ name: 'HI'}
。我正在使用 postman 进行测试。
答案 0 :(得分:0)
您可以修改模型,如下所示:
class Person< ActiveRecord::Base
before_save :change_name
private
def change_name
self.name="HI" if self.name=="HELLO"
end
end
答案 1 :(得分:0)
为了正确回答这个问题,我们需要理解如何创建一个名为“HELLO”的新记录需要设置为“HI”的逻辑。你有这个逻辑的查找表还是硬编码?
我能想到的最简单的事情是,您可以在执行更新之前通过设置参数的值来更改传递参数的值。 E.G。
params["name"] = "HI"
所以当你做一个person.update时,它会使用“name”参数设置为“HI”。
然后你可以在
中做到这一点def update
respond_to do |format|
params["name"] = "HI"
if @person.update(person_params)
format.html { redirect_to @person, notice: 'Person was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @person.errors, status: :unprocessable_entity }
end
end
end
您也可以进行更新,然后在更新后设置值:
def update
respond_to do |format|
if @person.update(person_params)
@person.name = "HI"
@person.save
format.html { redirect_to @person, notice: 'Person was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @person.errors, status: :unprocessable_entity }
end
end
end
答案 2 :(得分:-1)
从邮递员开始,您需要先调用登录操作。因此,它将在邮递员中创建一个会话,然后您可以调用更新操作。