2010-05-14 11 views
0

J'essaye d'utiliser le plugin Super Inplace Controls, qui a une méthode in_place_select. Je les modèles suivants:Rails: in_place_select Définir une clé étrangère

class Incident < ActiveRecord::Base 
    belongs_to    :incident_status 
    validates_existence_of :incident_status 
end 

class IncidentStatus < ActiveRecord::Base 
    has_many :incidents 
end 

En ce moment, IncidentStatus est juste un identifiant et un nom (« Open » et « fermé »). Dans la vue de présentation d'Incident, je souhaite autoriser un utilisateur à cliquer sur l'état actuel et à le modifier à l'aide d'un menu de sélection. Donc, en show.html.erb, je donne les résultats suivants:

<p> 
    <b>Status:</b> 
    <%= in_place_select :incident, :incident_status_id, :choices => @statuses.map { |e| [e.name, e.id] }, :display_text => @status.name %> 
</p> 

Cela suit l'exemple donné dans le Super Inplace Controls documentation assez près, ce qui est:

<%= in_place_select :employee, :manager_id, :choices => Manager.find_all.map { |e| [e.name, e.id] } %> 

Cela fonctionne vraiment bien jusqu'à ce que je cliquez sur OK pour changer le champ et soumettre le POST. Je vois le statut, puis quand je clique dessus, un menu déroulant apparaît avec 'Ouvrir' et 'Fermé'. Lorsque je sélectionne 'Fermé' et que j'appuie sur OK, le formulaire disparaît. Ce qui suit apparaît dans la console du serveur web:

Processing IncidentsController#set_incident_incident_status_id (for 127.0.0.1 at 2010-05-14 10:18:43) [POST] 
    Parameters: {"commit"=>"OK", "action"=>"set_incident_incident_status_id", "authenticity_token"=>"eahXrzwJwe+h2Byi1ELWXLy0QNmqF2EEXNw+eAfUJwU=", "id"=>"1", "controller"=>"incidents", "incident"=>{"incident_status_id"=>"1"}} 

...snip... 

ActionController::UnknownAction (No action responded to set_incident_incident_status_id. Actions: admin?, authenticated?, authorized?, create, destroy, edit, index, new, set_incident_incident_status, set_incident_title, show, and update): 

Il semble donc être à la recherche d'une méthode « set_incident_incident_status_id ». Si je définis cette méthode dans mon contrôleur d'incident, cela semble aller, mais je n'ai aucune idée de la façon de récupérer le "incident_status_id" => "1" qui a été passé et défini comme la clé étrangère.

Des idées? Merci d'avance!

Répondre

0

Enfin obtenu. J'avais besoin de créer une méthode dans le contrôleur d'incident. Il ressemble à ceci:

def set_incident_incident_status_id 
    @incident = @customer.incidents.find(params[:id]) 
    @incident.incident_status = IncidentStatus.find(params[:incident][:incident_status_id]) 
    @incident.save 
end 

Je dois le finir, mais c'est l'essentiel.

Questions connexes