2016-04-11 16 views
1

Ich erstelle eine App, um Spielergebnisse zwischen Freunden zu speichern. In meiner App werden Gruppen Ligen genannt.Hinzufügen eines Beitrittsschlüssels zu einer Gruppe

Um die Ligen privat zu halten, möchte ich einen Join-Schlüssel hinzufügen. Wenn eine Liga erstellt wird, wählt der Ersteller einen Join-Schlüssel. Später können andere Benutzer beitreten, indem sie aus einem Drop-down eine Liga auswählen und den genauen Join-Schlüssel eingeben. Der Benutzer kann nur, wenn der Join-Schlüssel mit der ausgewählten Liga übereinstimmt.

Controller:

def edit 
     @user = User.find(current_user.id) 
     @league_list = League.all.map{|l| [ l.league_name, l.id ] } 
    #  @league_keys = League.all.map{|l| [ l.join_key, l.id ] } 
    end 

    def update 
     @user = User.find(current_user.id) 

     if @user.update(user_join_league_params) #&& @league_list.league_id == @league_keys.league_id 
      @user.save 
      redirect_to root_path, :notice => "Successfully joined this league!" 
     else 
      render 'index' 
     end 
    end 

Wie man sehen kann ich die Benutzer bearbeiten haben league_id die Verbindung zu vervollständigen.

Ausblick:

<div class="panel panel-default" style="margin-right:10px; margin-left:10px; text-align:center"> 
      <div class="panel-heading"> 
       JOIN A LEAGUE 
      </div> 
      <div class="panel-body"> 

       <%= simple_form_for(@user) do |f| %> 

       <%= f.select(:league_id, @league_list) %><br> <br> 

       # <%= f.input_field :join_key %><br> <br> 

       <p>!! Watch out this cannot be changed after !!</p> 

       <br> <br> <%= f.submit "Join league", class: "btn-submit" %> 
       <% end %> 


     </div> 
</div> 

Also würde ich dieses Formular gerne nur die Update-Aktion durchführen, wenn die gewählte Liga der in Schlüsseln gefüllt übereinstimmt.

Ich habe nach einer Antwort in zahlreichen Posts auf stackoverflow gesucht, aber ich konnte einen Beitrag mit einem ähnlichen Problem nicht finden.

Wie kann ich das schaffen?

EDIT:

Relations:

class User < ActiveRecord::Base 

belongs_to :league 
end 

class League < ActiveRecord::Base 
    has_many :games 
    has_many :multiplayergames 
    has_many :users 
end 

ZWEITE EDIT:

Also habe ich versucht, die solloution zu implementieren.

Ich war mit simple_form für <% = f.select (: league_id, @league_list)%>

Ich habe versucht, es so zu tun:

<%= form_tag(user_path(@user), method: :put) do %> 
    <%= select_tag :league_id, options_for_select(@league_list) %><br> <br> 

       <p>Join Key</p> 
    <%= text_field_tag :join_key %><br> <br> 
    <p>!! Watch out this cannot be changed after !!</p> 

    <br> <br> <%= submit_tag "Join league", class: "btn-submit" %> 
<% end %> 

Jedoch gibt dies den Fehler:

param is missing or the value is empty: user

DRITTE EDIT:

Controller:

# JOIN A LEAGUE 

    def edit 
     @user = User.find(current_user.id) 
     @league_list = League.all.map{|l| [ l.league_name, l.id ] } 

    end 

    def update 
     @user = User.find(current_user.id) 
     @league = League.find_by_id(params[:league_id]) 

     if @league.join_key == params[:join_key] && @user.update(user_join_league_params) 

      redirect_to root_path, :notice => "Successfully joined this league!" 
     else 
      redirect_to edit_user_path(current_user), notice: "Could not join league check if join key is correct!" 
     end 
end 

def user_join_league_params 

     params.permit!(:league_id,:join_key) 
end 

VIEW:

<%= form_tag(user_path(@user), method: :put) do %> 

       <%= select_tag :league_id, options_for_select(@league_list, :league_id) %><br> <br> 

         <p>Join Key</p> 

       <%= text_field_tag :join_key %><br> <br> 

       <p>!! Watch out this cannot be changed after !!</p> 

      <br> <br> <%= submit_tag "Join league", class: "btn-submit" %> 

     <% end %> 
+0

was zwischen diesem Modell ist Beziehung? – uzaif

+0

Ich habe die Relationen aus den Modellen zu den Ligen –

+0

hinzugefügt. Sie haben also Ligen mit Joinschlüsseln und möchten, dass der Benutzer den Joinschlüssel der Liga eingibt, der der Benutzer beitreten möchte. Wenn ja, wie lernt der Benutzer den Join Key, den er in das Formular eingeben muss? – Pavan

Antwort

1

update Aktion kann wie folgt aussehen:

def update 
    @user = User.find(current_user.id) 
    @league = League.find_by_id(params[:league_id]) 
    if @league.join_key == params[:join_key] && @user.update(league_id: params[:league_id]) 
     redirect_to root_path, :notice => "Successfully joined this league!" 
    else 
     render 'index' 
    end 
end 

Form wie folgt aussehen:

<%= form_tag(user_path(@user), method: :put) do %> 
    <%= select_tag :league_id, options_for_select(@league_list) %><br> <br> 
    <%= text_field_tag :join_key %><br> <br> 
    <p>!! Watch out this cannot be changed after !!</p> 
    <br> <br> <%= submit_tag "Join league", class: "btn-submit" %> 
<% end %> 

Hinweis: Ich habe assu med join_key ist ein Attribut in Ihrem League Modell. Stellen Sie sicher, dass Sie params entsprechend in Ihrem user_join_league_params übergeben.

Edit:

Sie sollte Ihre params erlauben:

def user_join_league_params 
    params.permit!(:league_id,:join_key) 
end 
+0

Es gibt kein 'input_field_tag' in Schienen. – Pavan

+0

@Pavan danke .. übersehen beim Bearbeiten. – dp7

+0

Sie müssen auch '@ user.save' entfernen. – Pavan

Verwandte Themen