在Rails 5.1中使用link_to提交值

时间:2018-04-21 21:32:35

标签: ruby-on-rails

所以目前我有一个link_to,登录的用户可以点击:

<%= link_to "Enroll", [@task.project, @task] %>

用户通过订阅与项目建立关联。要为具有项目的用户创建新订阅,我为它编写了一些简单的表单。

<%= form_for([@project, @subzz]) do |f| %>



        <%= f.hidden_field :project_id, :value => @project.id %>
        <%= f.hidden_field :user_id, :value => current_user.id %>

      <div class="actions">
        <%= f.submit %>
      </div>
<% end %>

哪个工作正常并创建关联。但是,我希望用户能够在他点击“注册”而不是第二个额外提交按钮时创建订阅。

任何想法如何处理这个?我想过使用jQuery,但不知道如何用它来注入id以及它是否是“正确”的方式。

先谢谢大家!

编辑:

当使用张贴为答案的方法时,我得到:

param is missing or the value is empty: sub

我的更新表格:

  <%= form_for([@project, @subzz], html: {role: "form", id: "project_form"}) do |f| %>

        <%= hidden_field_tag :project_id, :value => @project.id %>
        <%= hidden_field_tag :user_id, :value => current_user.id %>


      <%= link_to "Enroll", [@task.project, @task], :onclick => "$('#project_form').submit() "%>

      <% end %>

subs_controller.rb

class SubsController < ApplicationController

  def create
    @subz = Sub.create(sub_params)
    project = @subz.project

    redirect_to root_path
  end





  private


    def sub_params
      params.require(:sub).permit(:project_id, :user_id)
    end

end

2 个答案:

答案 0 :(得分:1)

您可以使用现有的表单和link_to,只需编辑一些像这样编辑dorm_tag

<%= form_for([@project, @subzz], html: {role: "form", id: "project_form"}) do |f| %>

并将按钮移除为这样的形式

<div class="actions">
    <%= f.submit %>
</div>

并像这样编辑link_to

<%= link_to 'Enroll', "", :onclick => "$('#project_form').submit()" %>

它会起作用

<强>更新

您可以在没有表单的情况下实现此目的,注释掉此表单并编辑如下链接

<%= link_to 'Enroll', subs_path(project_id: @project.id, user_id: current_user.id), method: :post %>

和创建方法更新如下

def create
    @subz = Sub.new(sub_params)
    if @subz.save
        flash[:success] = 'Sub was successfully submited.'
        redirect_to root_path
    else
        flash[:danger] = 'Sub not submited'
        redirect_to request.referer
    end
end

更容易

或者如果您在表单之前保留,则表单中的链接和create方法编辑如下

def create
    @subz = Sub.new(sub_params)
    if @subz.save
        flash[:success] = 'Sub was successfully submited.'
        redirect_to root_path
    else
        flash[:danger] = 'Sub not submited'
        redirect_to request.referer
    end
end

,表单将如下所示

<%= form_for([@project, @subzz], html: {role: "form", id: "project_form"}) do |f| %>
    <%= hidden_field_tag :project_id, :value => @project.id %>
    <%= hidden_field_tag :user_id, :value => current_user.id %>
<% end %>

<%= link_to "Enroll", [@task.project, @task], :onclick => "$('#project_form').submit() "%>

如果您对链接标记上的[@task.project, @task]感到困惑,请使用直接链接

答案 1 :(得分:1)

所以我想出了以下解决方案:

我已经将子处理添加到application_controller中,因此它可用于project_controller。我还添加了项目,任务作为参考,以便我能够通过sub_controller而不是project_controller重定向到任务。

application_controller.rb

def create
    @subs = Sub.new(sub_params)
    project = @subs.project
    taskz = project.tasks.first
    if @subs.save
        redirect_to [taskz.project, taskz]
    end
  end


  private
    def sub_params
      params.require(:sub).permit(:project_id, :user_id)
    end

在project_controller的show.html.erb中,我使用旧表单:

<%= form_for([@project, @subz] do |f| %>



    <%= f.hidden_field :project_id, :value => @project.id %>
    <%= f.hidden_field :user_id, :value => current_user.id %>
    <%= f.submit "Submitted" %>


  <% end %>

工作正常。感谢以前的任何帮助!