【问题标题】:I get empty value in the params when I try to create join model当我尝试创建连接模型时,我在参数中得到空值
【发布时间】:2019-10-21 19:02:25
【问题描述】:

我正在通过与 Party 和 Guest 的关系为 has_many 创建一个加入模型 Invite,但我得到了空参数 [:party_id]。用户以访客身份登录,访客可以看到所有的派对列表,访客可以点击个人派对,有加入派对的链接。一旦客人点击“加入这个派对”,它会转到'/parties/2/invites/new',我有一张表格供客人填写。当客人提交表格时,我被卡住了。 url 更改为“/parties/2/invites”,但我仍然看到表单视图,刷新页面后,它会显示邀请索引页面。

我将 binding.pry 放入invites#create 并输入参数,我可以看到party_is ""。我看到 "commit"=>"Join!", "controller"=>"invites", "action"=>"create", "party_id"=>"3"} allowed: false>。

def new
    @invite = Invite.new
    @party_id = params[:party_id]

  end

  def create
    @invite = Invite.new(invite_params)
    binding.pry
    if @invite.save

       redirect_to guest_invites_path(current_user)
    else
      @party = Party.find(params[:party_id])
      render :new
    end
  end

private

  def invite_params
    params.require(:invite).permit(:add_on, :rsvp, :guest, :party_id)
  end
<%= form_with model: @invite, url: [@party, @invite], local: true do |f| %>
<%= f.label :add_on, "Add On" %>
<%= f.select :add_on, [1, 2, 3, 4], :prompt => 'Select One' %><br>

<%= f.label :rsvp, "RSVP" %>
<%= f.select :rsvp, [['Yes', true], ['No', false]], :include_blank => true %>

<%= f.hidden_field :party_id, :value => @party_id %>

<%= f.submit "Join!" %>
<% end %>
class Invite < ApplicationRecord
    belongs_to :party
    belongs_to :guest

    validates :add_on, :rsvp, presence: true
    accepts_nested_attributes_for :guest, :party
end

[4] pry(#)> raise params.inspect RuntimeError: "68nwEzR31GS2mcJGq9WhUrP0sp9zSjZENqY4/iosH8sn0zHRxz+PRXXWsQVJDG100FTc+dG4epdA/Cr1DsiRbQ==", "invite"=>"1", "rsvp"=>"true", "party_id"=>""} 允许: false>, "commit" =>“加入!”,“控制器”=>“邀请”,“动作”=>“创建”,“party_id”=>“3”} 允许:false> from (pry):4:in `create'

【问题讨论】:

    标签: ruby-on-rails has-many-through model-associations


    【解决方案1】:

    对您的代码进行一些更改

    从您的表单中,删除这一行

    <%= f.hidden_field :party_id, :value => @party_id %>
    

    然后在你的控制器中重写你的create方法到这个

    def create
      @party = Party.find(params[:party_id])
      @invite = Invite.new(invite_params)
      @invite.party_id = @party.id 
      if @invite.save
    
        redirect_to guest_invites_path(current_user)
      else
        render :new
      end
    end
    

    因此,由于您的 URL 已经包含 party_id,因此您无需在表单中输入它。试试这个,让我知道!

    【讨论】:

    • 我也试过了,它返回 nil。我只是更改了几个代码。你能再看一下吗?这次它不会以空字符串的形式返回,但是当我提交时,@invite 没有保存..
    • @Juny_mc 我已经编辑了我的答案,试试看告诉我。
    • 我修好了!这是因为 hidden_​​field 在f 下。所以party_id 像params[:invite][:party_id] 一样嵌套。所以我将 hidden_​​field 更改为hidden_field_tag 并在控制器中添加@invite.guest = current_user 并工作!谢谢你试图帮助我!我还从您的代码中添加了另外两行以使其正常工作。 :)
    • @Juny_mc 很高兴它有帮助!如果回答对您有帮助,您可以接受!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    相关资源
    最近更新 更多