2017-10-05 4 views
0

J'ai le tableau suivant dans la base de données et aussi le modèle créé pour cela.rails mise à jour l'action ne fonctionne pas

|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 

Je veux créer une action update dans contrôleur. Il mettra à jour le nom et la description en fonction du nom passé. Par exemple, je souhaite mettre à jour le nom HELLO à HI. Comment puis-je créer une action de mise à jour pour cela?

J'ai essayé suite à l'action update dans contrôleur mais il a frappé l'habitude de l'action 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 

de routes.rb

resources :person, only: [:index, :show, :create, :update, :destroy], defaults: { format: :json } 

d'essai Essayé comme celui-ci http://localhost:1111/person/HELLO et passant { name: 'HI'} dans params du corps. J'utilise postier pour les tests.

+0

vous devez ajouter une entrée dans 'config/routes .rb' - Normalement, la mise à jour se fait via le type de requête HTTP 'PUT', donc il ne sera pas accessible en tapant une URL dans votre barre d'adresse (qui envoie seulement une requête GET). Vous devrez soit utiliser un client HTTP comme Postman pour le tester, soit écrire un formulaire HTML. Voir http://guides.rubyonrails.org/form_helpers.html –

+0

J'ai l'entrée ajoutée dans routes.rb. J'utilise postier s'il vous plaît voir la ligne à la fin –

+0

Avez-vous mis la méthode HTTP dans le facteur à PUT? –

Répondre

-1

À partir du facteur, vous devez d'abord appeler l'action de connexion. Il va donc créer une session dans le facteur et ensuite vous pouvez appeler une action de mise à jour.

0

Vous pouvez modifier votre modèle, quelque chose comme ceci:

class Person< ActiveRecord::Base 

    before_save :change_name 

    private 

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

Pour répondre à cela, nous bien besoin de comprendre la logique de la façon dont la création d'un nouveau record avec name = « BONJOUR » aurait besoin d'être mis à "SALUT". Avez-vous une table de recherche pour cette logique ou est-ce codé en dur? La chose la plus simple à laquelle je puisse penser est que vous pouvez changer la valeur du paramètre passé avant d'effectuer la mise à jour en définissant la valeur du paramètre. PAR EXEMPLE. Donc, quand vous faites une mise à jour de personne, elle utilisera le paramètre «nom» défini sur «HI».

Ensuite, vous pouvez le faire dans un

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 

Vous pouvez également faire la mise à jour puis juste définir la valeur après la mise à jour:

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