Ruby on rails 如何将两个不同型号的ID传递给新型号?

Ruby on rails 如何将两个不同型号的ID传递给新型号?,ruby-on-rails,ruby,ruby-on-rails-6,Ruby On Rails,Ruby,Ruby On Rails 6,我当前正在尝试将用户id和事件id作为来宾的参数传递: 现在,在控制台中,我可以使用以下命令创建新的来宾对象: Guest.new(user_id: #, event_id: #) 创建来宾对象后,我可以调用“User.assisted_events”来获取此用户正在协助的所有事件,与我可以调用“Event.assistantes”的事件一样,我可以调用“Event.assistantes”来获取协助此事件的所有用户 我只是想找出一种从events索引提交用户id和事件id的方法 我在Even

我当前正在尝试将用户id和事件id作为来宾的参数传递:

现在,在控制台中,我可以使用以下命令创建新的来宾对象:

Guest.new(user_id: #, event_id: #)
创建来宾对象后,我可以调用“User.assisted_events”来获取此用户正在协助的所有事件,与我可以调用“Event.assistantes”的事件一样,我可以调用“Event.assistantes”来获取协助此事件的所有用户

我只是想找出一种从events索引提交用户id和事件id的方法

我在Events Controller内部使用一个名为“Assist”的自定义方法

def assist
    @guest = Guest.create(:user_id => User.find(session[:current_user_id]), :event_id => Event.find(params[:id]))

    respond_to do |format|
      if @guest.save
        format.html { redirect_to root_path, notice: 'You are now assiting this event!' }
        format.json { head :no_content}
      else
        format.html { redirect_to root_path, notice: "An error happened you can't assist this event" }
        format.json { render json: @guest.errors, status: :unprocessable_entity }
      end
    end
  end
class EventsController < ApplicationController
  before_action :set_event, only: [:show, :edit, :update, :destroy]

  # GET /Events
  # GET /Events.json
  def index
    @events = Event.all
  end

  # GET /Events/1
  # GET /Events/1.json
  def show
  end

  # GET /Events/new
  def new
    @event = User.find(session[:current_user_id]).events.build
  end

  # GET /Events/1/edit
  def edit
  end

  # POST /Events
  # POST /Events.json
  def create
    @event = User.find(session[:current_user_id]).events.build(event_params)

    respond_to do |format|
      if @event.save
        format.html { redirect_to @event, notice: 'Event was successfully created.' }
        format.json { render :show, status: :created, location: @event }
      else
        format.html { render :new }
        format.json { render json: @event.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /Events/1
  # PATCH/PUT /Events/1.json
  def update
    respond_to do |format|
      if @event.update(event_params)
        format.html { redirect_to @event, notice: 'Event was successfully updated.' }
        format.json { render :show, status: :ok, location: @event }
      else
        format.html { render :edit }
        format.json { render json: @event.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /Events/1
  # DELETE /Events/1.json
  def destroy
    @event.destroy
    respond_to do |format|
      format.html { redirect_to events_url, notice: 'Event was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  def assist
    @guest = Guest.create(:user_id => User.find(session[:current_user_id]), :event_id => Event.find(params[:id]))

    respond_to do |format|
      if @guest.save
        format.html { redirect_to root_path, notice: 'You are now assiting this event!' }
        format.json { head :no_content}
      else
        format.html { redirect_to root_path, notice: "An error happened you can't assist this event" }
        format.json { render json: @guest.errors, status: :unprocessable_entity }
      end
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_event
      @event = Event.find(params[:id])
    end

    # Only allow a list of trusted parameters through.
    def event_params
      params.require(:event).permit(:title, :body)
    end
end
这是链接事件索引处的辅助事件路径的当前行

用户模型

class User < ApplicationRecord
  has_many :events
  has_many :guests
  has_many :assisted_events, :through => :guests, :source => :event
end
编辑----

事件控制器

def assist
    @guest = Guest.create(:user_id => User.find(session[:current_user_id]), :event_id => Event.find(params[:id]))

    respond_to do |format|
      if @guest.save
        format.html { redirect_to root_path, notice: 'You are now assiting this event!' }
        format.json { head :no_content}
      else
        format.html { redirect_to root_path, notice: "An error happened you can't assist this event" }
        format.json { render json: @guest.errors, status: :unprocessable_entity }
      end
    end
  end
class EventsController < ApplicationController
  before_action :set_event, only: [:show, :edit, :update, :destroy]

  # GET /Events
  # GET /Events.json
  def index
    @events = Event.all
  end

  # GET /Events/1
  # GET /Events/1.json
  def show
  end

  # GET /Events/new
  def new
    @event = User.find(session[:current_user_id]).events.build
  end

  # GET /Events/1/edit
  def edit
  end

  # POST /Events
  # POST /Events.json
  def create
    @event = User.find(session[:current_user_id]).events.build(event_params)

    respond_to do |format|
      if @event.save
        format.html { redirect_to @event, notice: 'Event was successfully created.' }
        format.json { render :show, status: :created, location: @event }
      else
        format.html { render :new }
        format.json { render json: @event.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /Events/1
  # PATCH/PUT /Events/1.json
  def update
    respond_to do |format|
      if @event.update(event_params)
        format.html { redirect_to @event, notice: 'Event was successfully updated.' }
        format.json { render :show, status: :ok, location: @event }
      else
        format.html { render :edit }
        format.json { render json: @event.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /Events/1
  # DELETE /Events/1.json
  def destroy
    @event.destroy
    respond_to do |format|
      format.html { redirect_to events_url, notice: 'Event was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  def assist
    @guest = Guest.create(:user_id => User.find(session[:current_user_id]), :event_id => Event.find(params[:id]))

    respond_to do |format|
      if @guest.save
        format.html { redirect_to root_path, notice: 'You are now assiting this event!' }
        format.json { head :no_content}
      else
        format.html { redirect_to root_path, notice: "An error happened you can't assist this event" }
        format.json { render json: @guest.errors, status: :unprocessable_entity }
      end
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_event
      @event = Event.find(params[:id])
    end

    # Only allow a list of trusted parameters through.
    def event_params
      params.require(:event).permit(:title, :body)
    end
end
类事件控制器user.find(会话[:当前用户\u id]),:event\u id=>event.find(参数[:id]))
回应待办事项|格式|
如果@guest.save
format.html{将\重定向到根\路径,注意:'您现在正在协助此事件!'
format.json{head:no_content}
其他的
format.html{redirect_to root_path,注意:“发生错误,您无法协助此事件”}
format.json{render json:@guest.errors,status::unprocessable_entity}
结束
结束
结束
私有的
#使用回调在操作之间共享公共设置或约束。
def set_事件
@event=event.find(参数[:id])
结束
#仅允许通过列出受信任的参数。
def事件参数
参数require(:event).permit(:title,:body)
结束
结束
事件#索引文件

<p id="notice"><%= notice %></p>

<h1>Events</h1>
<% if session[:current_user_id].is_a? Integer %>
  <h3>Current User ID: <%= session[:current_user_id] %></h3>
<% else %>
  <%= link_to 'Create a new user', new_user_path  %>
<% end %>
<table>
  <thead>
    <tr>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @events.each do |event| %>
    <tr>
      <td><%= event.title  %></td>
      <td><%= event.body  %></td>
      </tr>
      <tr>
        <td><%= link_to 'Show', event %></td>
        <td><%= link_to 'Edit', edit_event_path(event) %></td>
        <td><%= link_to 'Assist', assist_event_path(event), method: :put, data: { confirm: 'Do you want to assist to this event?' } %></td>
    </tr>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to 'New event', new_event_path %>

事件 当前用户ID:

这是一种猜测,因为除了链接外,您没有发布任何表单。我不知道您传递给
events 35; index
的变量是什么,因为您没有为此发布控制器代码。也就是说,您可以通过
link\u将所需的任何参数传递到
。 编辑确定,这样看起来用户处于
会话[:current\u user\u id]
中,所以用户id来自于此

简化的最新编辑

将此路线添加到其他路线之前,以确保其位于顶部:

put '/assist' => 'events#assist'
然后以您的形式:

<td><%= link_to 'Assist', assist_path(event_id: event, user_id: session[:current_user_id]), method: :put, data: { confirm: 'Do you want to assist to this event?' } %></td>
编辑并清除控制器代码:

def assist
    @guest = Guest.new(:user_id => session[:current_user_id], :event_id => event_params[:id])

    respond_to do |format|
      if @guest.save
        format.html { redirect_to root_path, notice: 'You are now assiting this event!' }
        format.json { head :no_content}
      else
        format.html { redirect_to root_path, notice: "An error happened you can't assist this event" }
        format.json { render json: @guest.errors, status: :unprocessable_entity }
      end
    end
  end

您正在传递实际的事件和用户对象来创建@guest对象。此外,您还使用了参数,这意味着您没有经历事件参数操作。event_params操作的目的是允许/拒绝某些人提交您不想要的参数

感谢您的观察,我用事件#索引HTML文件和事件控制器编辑了这篇文章。我得到了以下错误:没有路由匹配{:action=>“assist”,:controller=>“events”,:event_id=>1,:user_id=>1},缺少必需的键:[:id],这是因为您没有指向您正在使用的链接的路由。在命令行上执行
rake routes
,并查找与所需匹配的路由。我将编辑可能路径的答案。您正在嵌套路径,这可能很方便,但当您嵌套三个深度时,有时会过于复杂。实际上,这看起来确实是正确的路径。可能只是参数中需要的许可证。我做了更正,但仍然是相同的错误。我验证了路线,并且是该方法的正确路线。另外,我尝试只使用Guest.new(event_params)并添加:user_id和:event_id参数,但我再次遇到了相同的错误。两条注释-Guest.create()完全创建了一条记录,我不知道为什么在该记录下方有“if@Guest.save”-它已经保存,此时您正在双击数据库。我也不知道你为什么要使用User.find(session[:current\u User\u id],当你想要的只是你已经拥有的id时。你不需要在数据库中搜索存储在session中或通过params传递的id。我只尝试了cookie session[:current\u User\u id]它无法识别ID,因此只有User.find允许我从用户那里获取ID。现在用户只是一个cookie,我直接从浏览器保存。我使用.create尝试该功能,但在复制和粘贴代码时忘记将其更改回.new。你应该查看
当前用户\u ID的值,因为听起来你并没有按照预期的方式使用它。如果User.find(1)有效,但是
put '/assist' => 'events#assist'
<td><%= link_to 'Assist', assist_path(event_id: event, user_id: session[:current_user_id]), method: :put, data: { confirm: 'Do you want to assist to this event?' } %></td>
# Only allow a list of trusted parameters through.
def event_params
  params.require(:event).permit(:title, :body, :event_id, :user_id)
end
def assist
    @guest = Guest.new(:user_id => session[:current_user_id], :event_id => event_params[:id])

    respond_to do |format|
      if @guest.save
        format.html { redirect_to root_path, notice: 'You are now assiting this event!' }
        format.json { head :no_content}
      else
        format.html { redirect_to root_path, notice: "An error happened you can't assist this event" }
        format.json { render json: @guest.errors, status: :unprocessable_entity }
      end
    end
  end