rails更新操作无效

时间:2017-10-05 01:14:05

标签: ruby ruby-on-rails-4 postman

我在数据库中有以下表格,还有为它创建的模型。

|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 进行测试。

3 个答案:

答案 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)

从邮递员开始,您需要先调用登录操作。因此,它将在邮递员中创建一个会话,然后您可以调用更新操作。