2017-10-21 1 views
0

J'ai vérifié l'ancien post similaire mais j'ai toujours des problèmes.Rails 5 - Rendu nouveau avec le paramètre

Lorsque je crée une nouvelle liste l'URL se présente comme ci-dessous: http://localhost:3000/listings/new?plan=1

Dans le form_for je me cache certains champs lorsque le plan = 1

<%= form_for(@listing) do |f| %> 
<%= render 'shared/error_messages', object: f.object %> 

    <%= f.hidden_field :plan, :value => @plan %> 

    <%= f.label :Title %> 
    <%= f.text_field :title, class: 'form-control' %> 

    <!-- don't show description for standard plan --> 
    <% if @plan != 1.to_s %> 
    <%= f.label :Description %> 
    <%= f.text_area :description, :rows => 10, 
     placeholder: "Describe your business...", class: 'form-control' %> 
    <% end %> 

Dans le ListingsController je mis le plan avant l'action:

before_action :set_plan,  only: [:new, :create] 

    def set_plan 
     @plan = params[:plan] 
    end 

donc je peux l'utiliser comme champ caché sur le formulaire ci-dessus.

Mon problème commence lorsque j'enregistrer le formulaire avec des erreurs. Le nouvel URL du formulaire est remplacé par http://localhost:3000/listings. Je peux voir le plan @ = 1 toujours sur la forme:

<input value="1" type="hidden" name="listing[plan]" id="listing_plan" /> 

, mais maintenant la forme montre tous les champs (qui devrait être caché en raison de cette condition <% si @plan = 1.to_s% >)

Actions en ListingsController:

def new 
    @listing = Listing.new 
    end 

    def create 
    @listing = current_user.listings.build(listing_params) if logged_in? 
    @plan = @listing.plan 

    if @listing.save 
     flash[:success] = "Listing created!" 
     redirect_to @listing 
    else 
     render 'new' 
    end 
    end 

J'ai essayé quelque chose comme ça, mais sans succès: render: action => 'nouveaux',: le plan => @ listing.plan et quelques autres

Comment puis-je masquer ces champs en cas d'erreur?

+0

vous ne pouvez pas accéder au paramètre plan avec '@ plan', utilisez plutôt' params [: plan] ' –

+0

Lorsque je vais au premier lien, je suis dans l'action Nouvelle: paramètres:! Ruby/hash: ActiveSupport :: HashWithIndifferentA Plan ccès : « 1 » contrôleur: annonces action: Nouvelle mais quand je sauve le pour les erreurs qu'il va dans Créer: paramètres:Ruby/hachage: ActiveSupport :: HashWithIndifferentAccess plan : '1' titre: '' permis: false commettras: Inscrivez-vous contrôleur: annonces l'action: créer Le plan est là, mais quand je le fais à lui mendier de Create: \ @plan = params [: plan] il n'obtient pas la valeur pour \ @plan. Pourquoi? – 82skynet

Répondre

0

Vous devriez pouvoir résoudre ceci en modifiant votre ListingsController pour définir le plan de création. Plus précisément, dans ListingsController.rb:

# app/controllers/listings_controller.rb 
before_action :set_plan, only: [:new, :create] 

, être sûr que votre méthode listing_params permet également :plan.

Si vous souhaitez que cela fonctionne lors de la mise à jour, ajoutez également :update à votre before_action.

+0

Salut Tom, j'ai essayé ça mais pas de chance, le plan est autorisé sur params. Set_plan before create ne transmettait aucune valeur donc j'ai ajouté cette ligne dans Create - \ @plan = \ @ listing.plan (voir question éditée). Je peux voir la valeur sur le formulaire soumis avec des erreurs - , donc je ne comprends pas pourquoi la FI ne le fait pas ne fonctionne pas – 82skynet

0

Je l'ai réparé.

@plan = params[:plan] 

est la chaîne de retour (lorsque le champ DB est un entier), donc je l'ai changé:

@plan = params[:plan].to_i 

et maintenant sous la forme je le ci-dessous pour toutes les actions:

<% if @plan != 1 %> 
+0

Excellent. Heureux que tu es parvenu à le faire fonctionner. –