我对Rails是全新的,并且仍然存在从ListaUsuarios视图通过此链接发送参数的问题,尽管现在尝试和研究了很多小时:
<%= link_to "Agregar", @solicitud_contacto, method: :post %>
由于我已经设置了
,它会按预期进入创建操作resources :solicitud_contactos
在routes.rb中。但是我收到以下错误:
ActiveRecord::StatementInvalid in SolicitudContactosController#create
SQLite3::ConstraintException: solicitud_contactos.solicitante_id may not be NULL: INSERT INTO "solicitud_contactos" ("created_at", "solicitado_id", "solicitante_id", "updated_at") VALUES (?, ?, ?, ?)
只是为了解释,因为问题出现了:SolicitudContacto应该是添加另一个用户的需求(“友谊”或“联系”需求),以便第二个用户可以接受或拒绝需求。所以我只想在有人点击链接时在数据库中保存这样的需求。 “Usuario”(“SolicitudContacto”模型中的属性类型)仅表示“用户”。
另外,我得到它的方式,以下链接应该得到相同的结果:
<%= link_to "Agregar", solicitud_contacto_path(@solicitud_contacto), method: :post %>
但它给我一个不同的错误。显然,这里会传输ID,但链接会转到show动作。
Routing Error
No route matches {:action=>"show", :controller=>"solicitud_contactos", :id=>#<SolicitudContacto id: nil, solicitante_id: 2, solicitado_id: 4, created_at: nil, updated_at: nil>}
我在
中遇到了同样的问题<%= link_to "Rechazar", @solicitud_contacto, :method => :delete %>
在同一视图中。
编辑:感谢Baldricks评论至少删除链接现在有效,我不记得我必须使用数据库中的实际对象。因此,通过以下方法替换相应的if块:
<% if (index = @solicitantes.index { |solic| solic.solicitante.id == usuario.id }) != nil %>
<%= link_to "Rechazar", @solicitantes[index], :method => :delete %>
@solicitud_contacto对象,带有
的相应ID@ solicitud_contacto.solicitante.id @ solicitud_contacto.solicitado.id
肯定是设置的,因为我将它们打印在相同的视图中进行测试。我希望有人可以帮助我,因为这确实令人沮丧...非常感谢!
P.S:
我也读过这个:
<%= javascript_include_tag "application" %>
应该在application.html.erb中设置。它是!
以下是相关代码:
SolicitudContacto模型
class SolicitudContacto < ActiveRecord::Base
attr_accessible :solicitado_id, :solicitante_id
belongs_to :solicitado, class_name: "Usuario"
belongs_to :solicitante, class_name: "Usuario"
end
SolicitudContacto Controller
class SolicitudContactosController < ApplicationController
def create
@solicitud = SolicitudContacto.new(params[:solicitud_contacto])
@solicitud.save
redirect_to :controller => SearchUsersController, :action => BusquedaUsuarios
end
def destroy
@solicitud = SolicitudContacto.find(params[:id])
@solicitud.destroy
redirect_to :controller => SearchUsersController, :action => BusquedaUsuarios
end
def index
@solicitudes = SolicitudContacto.all
end
def new
end
def show
@solicitud = SolicitudContacto.find(params[:id])
end
end
SearchUsersController
class SearchUsersController < ApplicationController
def BusquedaUsuarios
@usuario = Usuario.new
end
def ListaUsuarios
# DELETE!!!!!
$current_usuario = Usuario.find(2)
@cur_usuario = $current_usuario;
@solicitud_contacto = SolicitudContacto.new
@usuario = Usuario.new(params[:usuario])
@filtros = Hash.new(0);
if @usuario.nombre != ""
@filtros["nombre"] = @usuario.nombre
end
if @usuario.apellido != ""
@filtros["apellido"] = @usuario.apellido
end
if @usuario.email != ""
@filtros["email"] = @usuario.email
end
@solicitados = @cur_usuario.solicitantes
@solicitantes = @cur_usuario.solicitados
@contactos = @cur_usuario.user1s + @cur_usuario.user2s
@usuarios = Usuario.where(@filtros).order(:nombre).all
end
end
ListaUsuarios(SearchUsersController的用户列表视图)
<h1>SearchUsers#ListaUsuarios</h1>
<p>Find me in app/views/search_users/ListaUsuarios.html.erb</p>
<table>
<tr>
<th>Nombre</th>
<th>Apellido</th>
<th>Email</th>
<th></th>
</tr>
<% @usuarios.each do |usuario| %>
<tr>
<td><%= usuario.nombre %></td>
<td><%= usuario.apellido %></td>
<td><%= usuario.email %></td>
<td>
<% @solicitud_contacto.solicitante = @cur_usuario %>
<% @solicitud_contacto.solicitado = usuario %>
<br>
<%= @solicitud_contacto.solicitante.id %>
<%= @solicitud_contacto.solicitado.id %>
<br>
<!-- responder la solicitud -->
<% if @solicitantes.index { |solic| solic.solicitante.id == usuario.id } != nil %>
<%= link_to "Rechazar", @solicitud_contacto, :method => :delete %>
<!-- solicitud ya fue mandada -->
<% elsif @solicitados.index { |solic| solic.solicitado.id == usuario.id } != nil %>
Esperando Respuesta
<!-- solicitar contacto -->
<% else %>
<%= link_to "Agregar", @solicitud_contacto, method: :post %>
<% end %>
</td>
</tr>
<% end %>
</table>
答案 0 :(得分:0)
创建显示或删除操作的链接时,必须使用持久对象(即对象是在数据库中创建了ID的对象)。在您正在执行的控制器中
@solicitud_contacto = SolicitudContacto.new
对象已实例化,但未在数据库中创建(您必须为此调用save
或create
)。它没有身份证。
如何解决您的问题?我不确定,我不明白你想要实现的目标。我认为目标链接是错误的,应该是@solicitud_contacto.solicitante
<% if @solicitantes.any? { |solic| solic.id == usuario.id } %>
<%= link_to "Rechazar", @solicitud_contacto.solicitante, :method => :delete %>
...