0

我对 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

肯定是设置的,因为我将它们打印在同一视图中进行测试。我希望有人可以帮助我,因为这真的有点令人沮丧......非常感谢!

PS:

我还读到:

<%= 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

Solicitud联系控制器

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

搜索用户控制器

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>
4

1 回答 1

0

当您创建指向显示或删除操作的链接时,您必须使用持久对象(即,在数据库中创建的具有 ID 的对象)。在你正在做的控制器中

@solicitud_contacto = SolicitudContacto.new

该对象已实例化,但未在 DB 中创建(您必须为此调用saveor )。create它没有身份证。

如何解决您的问题?我不确定,我不明白你想要达到什么目的。我认为指向目标的链接是错误的,应该是@solicitud_contacto.solicitante

<% if @solicitantes.any? { |solic| solic.id == usuario.id }  %>
    <%= link_to "Rechazar", @solicitud_contacto.solicitante, :method => :delete %>
...
于 2013-12-05T14:59:41.463 回答