Ruby on rails 如何绕过表单并通过Rails中的链接将信息直接传递给create操作

Ruby on rails 如何绕过表单并通过Rails中的链接将信息直接传递给create操作,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,设置 该应用程序有3个型号。成员模型、支持模型和参与模型。成员模型跟踪我的web应用程序的所有用户。支持模型跟踪用户支持我们组织的多种不同方式。参与模型通过跟踪成员id和支持id(显示该成员在哪些支持领域处于活动状态)来连接其他两个模型 当前功能 在成员的配置文件中,他们可以查看“支持”选项卡,该选项卡查询他们可以从支持模型支持的所有不同领域。然后,它检查是否有包括其id和该支持区域id的参与,并说明他们当前是否支持 期望的结果 我想有一个链接,他们可以点击,将创建或删除参与。因此,如果他们目前

设置

该应用程序有3个型号。成员模型、支持模型和参与模型。成员模型跟踪我的web应用程序的所有用户。支持模型跟踪用户支持我们组织的多种不同方式。参与模型通过跟踪成员id和支持id(显示该成员在哪些支持领域处于活动状态)来连接其他两个模型

当前功能

在成员的配置文件中,他们可以查看“支持”选项卡,该选项卡查询他们可以从支持模型支持的所有不同领域。然后,它检查是否有包括其id和该支持区域id的参与,并说明他们当前是否支持

期望的结果

我想有一个链接,他们可以点击,将创建或删除参与。因此,如果他们目前正在提供财务支持,它将声明他们正在提供,并提供一个链接以停止以这种方式提供支持,单击该链接将删除参与记录;反之亦然,如果他们没有提供财务支持,将显示一个链接开始提供支持,该链接将创建参与记录。(最终,我将集成一个切换函数,该函数允许成员来回切换,但我需要先解决这个问题。)

问题

有没有办法通过
link_to
向“创建”或“销毁”操作发送参数以实现此功能?目前我正在执行以下操作,但出现错误:

<%= 
    link_to "Start Supporting", 
    involvements_path(member_id: current_member.id, 
                      support_id: support_area.id), 
    method: :post 
%>
当我执行byebug时,我得到以下参数输出:

(byebug) params
<ActionController::Parameters {"_method"=>"post", 
                               "member_id"=>"1", 
                               "support_id"=>"2",                                                                                                                                             
                               "controller"=>"involvements", 
                               "action"=>"create"} 
                                permitted: false>
app/models/investment.rb

class Involvement < ApplicationRecord
  belongs_to :member
end
app/views/profiles/show.html.erb

<% if @user == 'Owner' %>

  <% if @show_page == 'account' %>
    <%= render 'profile_account' %>
  <% elsif @show_page == 'main' %>
    <%= render 'profile_main', locals: { profile: @profile, 
                                         user: @user } %>
  <% elsif @show_page == 'support' %>
    <%= render 'profile_support', locals: { profile: @profile, 
                                            user: @user, 
                                            supports: @supports, 
                                            involvement: @involvements 
                                          } %>
  <% else %>
    <script type="text/javascript">
        window.location.href="<%= 
               member_profile_path(current_member.profile.u_name) 
        %>"
    </script>
  <% end %>

<% else %>
  <%= render 'profile_main', locals: { profile: @profile, 
                                       user: @user } %>
<% end %>

window.location.href=“”
app/views/profiles/_profile_support.html.erb

<h1>This is the Support Page</h1>

<table style="width:50%">
  <tr>
    <th>Support Area</th>
    <th>Support Status</th>
    <th>Change Status</th>
  </tr>
  <% @supports.each do |support_area| %>
    <tr>  
      <th>
        <%= link_to support_area.title, support_page_path(support_area.title) %>
      </th>
      <th>
        <% @presence_check = Involvement.exists?(member_id: current_member.id, 
                                                 support_id: support_area.id) %>
        <% if @presence_check %>
          Supporting
        <% else %>
          Not Supporting
        <% end %>
      </th>
      <th>
        <%= link_to "Start Supporting", 
                    involvements_path(member_id: current_member.id, 
                                      support_id: support_area.id), 
                    method: :post %>
      </th>
    </tr>
  <% end %>
</table>
这是支持页面
支援区
支持状态
改变状态
支持的
不支持
app/controllers/involvements\u controller.rb

class InvolvementsController < ApplicationController
  before_action :set_involvement, only: [:show, :edit, :update, :destroy]

  def index
    @involvements = Involvement.all
  end

  def show
  end

  def new
    @involvement = Involvement.new
  end

  def edit
  end

  def create    
    @involvement = Involvement.new(involvement_params)
    # byebug
    respond_to do |format|
      if @involvement.save
        format.html { redirect_to @involvement, 
                      notice: 'Involvement was successfully created.' }
      else
        format.html { render :new }
      end
    end
  end

  def update
    respond_to do |format|
      if @involvement.update(involvement_params)
        format.html { redirect_to @involvement, 
                      notice: 'Involvement was successfully updated.' }
      else
        format.html { render :edit }
      end
    end
  end

  def destroy
    @involvement.destroy
    respond_to do |format|
      format.html { redirect_to involvements_url, 
                    notice: 'Involvement was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

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

    # Never trust parameters from the scary internet, 
    # only allow the white list through.

    def involvement_params
      # byebug
      params.require(:involvement).permit(:member_id, :support_id)
    end
end
类涉及控制器
问题在于如何将参数传递给控制器,以及如何在控制器中使用参数。您的控制器执行以下操作:

def involvement_params
  params.require(:involvement).permit(:member_id, :support_id)
end
这要求
:member_id
:support_id
嵌套在
参与
下,但您将它们作为URL中的顶级参数传递。尝试更新您的链接,如下所示:

<%= link_to "Start Supporting",
  involvements_path(
    involvement: {
      member_id: current_member.id,
      support_id: support_area.id
    }
  ),
  method: :post 
%>


这将正确嵌套参数。

谢谢!成功了。我不知道它在寻找嵌套的参数。谢谢你,德里克!
class InvolvementsController < ApplicationController
  before_action :set_involvement, only: [:show, :edit, :update, :destroy]

  def index
    @involvements = Involvement.all
  end

  def show
  end

  def new
    @involvement = Involvement.new
  end

  def edit
  end

  def create    
    @involvement = Involvement.new(involvement_params)
    # byebug
    respond_to do |format|
      if @involvement.save
        format.html { redirect_to @involvement, 
                      notice: 'Involvement was successfully created.' }
      else
        format.html { render :new }
      end
    end
  end

  def update
    respond_to do |format|
      if @involvement.update(involvement_params)
        format.html { redirect_to @involvement, 
                      notice: 'Involvement was successfully updated.' }
      else
        format.html { render :edit }
      end
    end
  end

  def destroy
    @involvement.destroy
    respond_to do |format|
      format.html { redirect_to involvements_url, 
                    notice: 'Involvement was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

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

    # Never trust parameters from the scary internet, 
    # only allow the white list through.

    def involvement_params
      # byebug
      params.require(:involvement).permit(:member_id, :support_id)
    end
end
def involvement_params
  params.require(:involvement).permit(:member_id, :support_id)
end
<%= link_to "Start Supporting",
  involvements_path(
    involvement: {
      member_id: current_member.id,
      support_id: support_area.id
    }
  ),
  method: :post 
%>