2017-10-05 105 views
0

我在数据库中有以下表格,也有为它创建的模型。导轨更新操作不起作用

|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行动。它将根据传递的名称更新名称和描述。例如,我想更新名称HELLOHI。我如何为此创建更新操作?

我试着按照控制器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和身体PARAMS通过{ name: 'HI'}。我正在使用邮递员进行测试。

+0

你需要添加'配置/路由条目.rb' - 通常通过'PUT' HTTP请求类型完成更新,因此通过在地址栏中输入URL(仅发送GET请求)将无法访问它。您需要使用像Postman这样的HTTP客户端来测试它,或者编写一个HTML表单。请参阅http://guides.rubyonrails.org/form_helpers.html –

+0

我在route.rb中添加了条目。我正在使用邮递员,请参阅末尾的行 –

+0

您是否将postman中的HTTP方法设置为PUT? –

回答

-1

从邮递员您需要先呼叫登录操作。所以它会在邮递员中创建一个会话,然后你可以调用更新操作。

0

您可以修改你的模型,这样的事情:

class Person< ActiveRecord::Base 

    before_save :change_name 

    private 

    def change_name 
     self.name="HI" if self.name=="HELLO" 
    end 
end 
0

要正确地回答这个问题,我们需要了解如何与名称创建一个新的记录的逻辑=“HELLO”需要被设置为“HI”。你有这个逻辑的查询表吗?还是硬编码?

我能想到的最简单的事情是,您可以在更新之前通过设置参数的值来更改传递参数的值。例如。

params["name"] = "HI" 

因此,当你做一个person.update它将使用“名称”参数设置为“你好”。

然后,你可以做到这一点的

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