Contexto: Tengo 2 modelos, Idea y Project. Un project puede tener varias ideas, y una idea siempre corresponde a un project.
Problema: Estoy creando un form en el que quiero indicar a la hora de crear una idea, que pertenece a un determinado Project, utilizando el project_id de este. He estado echando un vistazo y todo lo que he encontrado ha sido utilizar el accepts_nested_attributes_for incluido en mi modelo de Idea para que me acepte elementos del otro modelo Project. Puedo crear nuevos items de Idea especificando su project_id si lo hago a través de la consola, pero no a través de la app en sí.
Lo que tengo hasta ahora es:
El modelo Idea con el accept_nested_attributes de Project App > Models > Idea.rb
El form
<%= form_for(@idea) do |f| %>
<% if @idea.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@idea.errors.count, "error") %> prohibited this idea from being saved:</h2>
<ul>
<% @idea.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
¿Qué error te sale?
Puede ser que este guión te de problemas:
En la acción new, la línea
@idea.project_id
no hace nada, sólo estás leyendo el atributo project_id de @idea, a no ser que hayas personalizado el método initialize en idea.rb, será nil.
En el controlador, tu acción create debería ser algo así
def create
@idea = Idea.new(idea_params)
respond_to do |format|
if @idea.save
format.html { redirect_to @idea, notice: 'Idea was successfully created.' }
format.json { render action: 'show', status: :created, location: @idea }
else
format.html { render action: 'new' }
format.json { render json: @idea.errors, status: :unprocessable_entity }
end
end
end
Sin olvidarte del método privado idea_params
def idea_params
params.require(:idea).permit(:name, :project_id)
end
He creado un scaffold y me funciona perfectamente, aunque sin añadir el campo de la foto. Si dices el error que obtienes será más fácil localizar el problema.
Gracias por intentarlo.
Mi primer error, de primeras, no me saca el campo para indicar el project_id.
Si echas un vistazo al código que pegué antes verás donde va colocado.
Mi controller para idea > def create es exactamente el mismo que el tuyo, incluidos params, con la excepción de que los 'render action' sólo tengo 'render', estoy trabajando en rails 4, así que entiendo que será un cambio minúsculo)
He dejado parte del log aquí https://gist.github.com/malditojavi/f476745b94f376bdc0c2 pero no tiene errores puesto que no tengo posibilidad de indicarle el project_id.
De todos modos voy a probar a crear un form con inputs de diferentes modelos con gem simple form a ver si es más manejable.
A ver, si he entendido bien, quieres crear una idea y asociarla a un proyecto ya existente. En ese caso, no es necesario usar 'accepts_nested_attributes_for', que se utiliza para modificar entidades relacionadas. Por ejemplo, sería necesario usarlo si quisieras crear una idea y un proyecto desde el mismo formulario. http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html
En el formulario, te valdría esto:
_fields.html.erb
....
....
Y en el modelo, podrías eliminar el accepts_nested_attributes_for.
Espero haber entendido bien el problema y que te haya servido de ayuda.
Sí, esa era mi idea en un principio, un form que me crease una nueva entrada en mi db, con elementos de idea y de project. Al final he encontrado un post que resumen bastante bien mi problema (http://stackoverflow.com/questions/15919761/rails-4-nested-attributes-unpermitted-parameters) Gracias por tu ayuda de todos modos!
Estaría bien saber cuál es el error y una traza del log para tener más información. Así de buenas el código parece estar bien, pero faltaría ver el controlador.
Problema: Estoy creando un form en el que quiero indicar a la hora de crear una idea, que pertenece a un determinado Project, utilizando el project_id de este. He estado echando un vistazo y todo lo que he encontrado ha sido utilizar el accepts_nested_attributes_for incluido en mi modelo de Idea para que me acepte elementos del otro modelo Project. Puedo crear nuevos items de Idea especificando su project_id si lo hago a través de la consola, pero no a través de la app en sí.
Lo que tengo hasta ahora es:
El modelo Idea con el accept_nested_attributes de Project
App > Models > Idea.rb
class Idea < ActiveRecord::Base
belongs_to :project
accepts_nested_attributes_for :project
mount_uploader :picture, PictureUploader
validates :name, presence: true, allow_blank: false
end
El form
<%= form_for(@idea) do |f| %>
<% if @idea.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@idea.errors.count, "error") %> prohibited this idea from being saved:</h2>
<ul>
<% @idea.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :description %><br>
<%= f.text_area :description %>
</div>
<div class="field">
<%= f.label :picture %><br>
<%= f.file_field :picture %>
</div>
<%= f.fields_for :project do |f| %>
<div class="field">
<%= f.label :project %><br />
<%= f.number_field :project_id %>
</div>
<% end -%>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
Y el controller > ideas_controller.rb con esta parte editada
# GET /ideas/new
def new
@idea = Idea.new
@idea.project_id
respond_to do |format|
format.html # new.html.erb
format.json { render json: @idea }
end
end
Help! :)
26/05/2014 13:44
Puede ser que este guión te de problemas:
En la acción new, la línea
@idea.project_id
no hace nada, sólo estás leyendo el atributo project_id de @idea, a no ser que hayas personalizado el método initialize en idea.rb, será nil.
En el controlador, tu acción create debería ser algo así
def create
@idea = Idea.new(idea_params)
respond_to do |format|
if @idea.save
format.html { redirect_to @idea, notice: 'Idea was successfully created.' }
format.json { render action: 'show', status: :created, location: @idea }
else
format.html { render action: 'new' }
format.json { render json: @idea.errors, status: :unprocessable_entity }
end
end
end
Sin olvidarte del método privado idea_params
def idea_params
params.require(:idea).permit(:name, :project_id)
end
He creado un scaffold y me funciona perfectamente, aunque sin añadir el campo de la foto. Si dices el error que obtienes será más fácil localizar el problema.
26/05/2014 20:37
Mi primer error, de primeras, no me saca el campo para indicar el project_id.
Si echas un vistazo al código que pegué antes verás donde va colocado.
Mi controller para idea > def create es exactamente el mismo que el tuyo, incluidos params, con la excepción de que los 'render action' sólo tengo 'render', estoy trabajando en rails 4, así que entiendo que será un cambio minúsculo)
He dejado parte del log aquí https://gist.github.com/malditojavi/f476745b94f376bdc0c2 pero no tiene errores puesto que no tengo posibilidad de indicarle el project_id.
De todos modos voy a probar a crear un form con inputs de diferentes modelos con gem simple form a ver si es más manejable.
26/05/2014 22:54
En el formulario, te valdría esto:
_fields.html.erb
....
....
Y en el modelo, podrías eliminar el accepts_nested_attributes_for.
Espero haber entendido bien el problema y que te haya servido de ayuda.
26/05/2014 23:16
26/05/2014 16:56
27/05/2014 08:26
resource :projects do
resource :ideas
end
Cada vez que crearas una idea el params[:project_id] tendría el identificar de proyecto.