2017-10-03 15 views
3

J'ai un compte admin pour éditer certains messages d'autres utilisateurs, principalement des erreurs typographiques. Quand j'utilise le contrôleur ci-dessous, il met à jour user_id car je reçois cela de current_user (admin dans mon cas), donc il met à jour le post avec mon compte, et l'article ressemble à celui que j'ai envoyé. Il remplace l'ID utilisateur réel.Rails 5, mise à jour des champs de formulaire spécifiques dans le contrôleur

def update 
    respond_to do |format| 
     if @post.update(post_params) 
     format.html { redirect_to @post, notice: 'Post was successfully updated.' } 
     format.json { render :show, status: :ok, location: @post } 
     else 
     format.html { render :edit } 
     format.json { render json: @post.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

BTW ceci est mon _form.html.erb qui est utilisé à la fois pour les nouveaux et éditer.

<%= simple_form_for(@post) do |f| %> 
    <%= f.error_notification %> 

    <%= f.input :user_id, input_html: { value: current_user.id }, as: :hidden %> 
    <%= f.input :title, required: true, autofocus: true, placeholder: "Post title: *", label: false, input_html: { maxlength: 140, size: 40 } %> 
    <%= f.input :link, required: true, placeholder: "Post link: *", label: false, input_html: { maxlength: 300, size: 40 } %> 
    <%= f.input :description, placeholder: "Summary of the Post", label: false, input_html: { maxlength: 600, :rows => 5 } %> 

    <%= f.button :submit, "Post" %> 
<% end %> 

et mon schéma

create_table "posts", force: :cascade do |t| 
    t.string "title" 
    t.string "link" 
    t.text "description" 
    t.integer "user_id" 
    t.string "slug" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.index ["slug"], name: "index_posts_on_slug" 
    t.index ["user_id"], name: "index_posts_on_user_id" 
    end 

Comment puis-je ignorer la mise à jour user_id? J'ai essayé de coder ci-dessous juste pour définir les champs que je voulais mettre à jour, mais cela ne fonctionne pas. Merci

if @post.update(post_params[:title, :link, :description]) 
+0

ou 'input_html: {valeur: @ post.user_id.empty? ? current_user.id: @ post.user_id} ' – Hatik

+0

il donne" méthode non définie 'user_id 'pour l'erreur" NilClass "car ce n'est pas une chose pour un nouveau poste, je crois – Designer

Répondre

4

Essayez ceci à la place, merci!

@post.title = post_params[:title] 
@post.link = post_params[:link] 
@post.description = post_params[:description] 

Mettre cela avant respond do et remplacer if @post.update(post_params) à if @post.save

+0

où ça va? Il ne peut pas aller dans @ post.update ("ici") et si nous définissons avant la ligne de mise à jour, comment assignons-nous cela en mise à jour? Merci – Designer

+0

Découvrez la réponse éditée. –

+0

oh ça a marché! mais pourquoi .save ferait puisque nous sommes en train de mettre à jour? – Designer