Ruby on rails Rails-表单中的条件语句识别错误的url参数

Ruby on rails Rails-表单中的条件语句识别错误的url参数,ruby-on-rails,if-statement,request,hidden-field,Ruby On Rails,If Statement,Request,Hidden Field,我在附件和用户及团队之间有多态关系,因此用户和团队都可以上传附件。单击“添加文件”按钮时,:team_id或:user_id作为参数传递。然后,attachments#new表单中的一个隐藏字段告诉控制器请求是否来自团队或用户,以便可以将属性#更新应用于适当的模型。然而,在实践中,团队请求是作为用户子操作传递的,反之亦然。对可能出现的问题有什么想法吗 class Attachment < ActiveRecord::Base belongs_to :upload, polymorphi

我在附件和用户及团队之间有多态关系,因此用户和团队都可以上传附件。单击“添加文件”按钮时,:team_id或:user_id作为参数传递。然后,attachments#new表单中的一个隐藏字段告诉控制器请求是否来自团队或用户,以便可以将属性#更新应用于适当的模型。然而,在实践中,团队请求是作为用户子操作传递的,反之亦然。对可能出现的问题有什么想法吗

class Attachment < ActiveRecord::Base
  belongs_to :upload, polymorphic: true
end

class User < ActiveRecord::Base
  has_many :attachments, as: :upload
end

class Team < ActiveRecord::Base
  has_many :attachments, as: :upload
end

我认为问题在于你在
附件#new
中的
if
语句。params[:team_id]和params[:user_id]都将返回一个整数,因此您的
if
语句无法真正判断请求是来自团队还是用户。建议您将
参数[:team_id]
存储在变量中,例如
@team_id
,然后将if语句更改为如下内容:

<% unless @team_id.nil? %>
  <%= hidden_field_tag(:subaction, 'Team') %>
<% else%>
  <%= hidden_field_tag(:subaction, 'User') %>
<% end %>


但是,您可以通过在模型中使用多态关联来进一步改进这一点,如以下链接所述:

更改url参数以传递字符串“User”或“Team”,而不是Team\u id或User\u id,从而允许controller if语句正常运行

团队表演

“团队”),类别:“btn btn md”%>
用户#显示

'User'),类别:“btn btn md”%>
附件#新增



我将“多项式”关系替换为“多态性”。不过,您的参数看起来不像是在Rails意义上定义了多态关系。不过,我不明白为什么会出现“反之亦然”的行为。你是如何分析这种行为的?谢谢。当我从团队页面添加附件时,子操作被注册为“用户”。当我从用户页面添加附件时,子操作被注册为“团队”定义“被注册为”关联被设置为polymoprhic,我编辑了文章以包含附件、用户和团队的模型。我将url参数放在首位的唯一原因是为了能够区分请求来自何处。问题仍然在于我概述的
if
语句。同意,感谢您指出if语句仅识别已传递的整数。我更改了url参数,以便传递“团队”或“用户”而不是id。回答如下。是的,传递参数[:upload_type]比我的建议要好
<%= link_to "Add Files", new_attachment_path(:user_id => current_user), class: "btn btn-md" %>
<% provide(:title, 'Add file') %>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(@attachment) do |f| %>
      <%= render 'shared/error_messages', object: f.object %>

      <%= f.file_field :file %>

      <% if request.path == new_attachment_path(params[:team_id]) %>
        <%= hidden_field_tag(:subaction, 'Team') %>
      <% elsif request.path == new_attachment_path(params[:user_id]) %>
        <%= hidden_field_tag(:subaction, 'User') %>
      <% end %>

      <%= f.submit "Add Files", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>
def create
    @attachment = Attachment.create(attachment_params)
    @team = Team.find_by(params[:team_id])
    @user = User.find_by(params[:user_id])
    if @attachment.save
      if params[:subaction] == 'Team'
        @attachment.update_attribute(:upload, @team)
        flash[:success] = "Team file uploaded!"
        redirect_to @team
      elsif params[:subaction] == 'User'
        @attachment.update_attribute(:upload, @user)
        flash[:success] = "User file uploaded!"
        redirect_to current_user
      end
    else
      render 'new'
    end
end
<% unless @team_id.nil? %>
  <%= hidden_field_tag(:subaction, 'Team') %>
<% else%>
  <%= hidden_field_tag(:subaction, 'User') %>
<% end %>
<%= link_to "Add Files", new_attachment_path(:upload_type => 'Team'), class: "btn btn-md" %>
<%= link_to "Add Files", new_attachment_path(:upload_type => 'User'), class: "btn btn-md" %>
<% provide(:title, 'Add file') %>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(@attachment) do |f| %>
      <%= render 'shared/error_messages', object: f.object %>

      <%= f.file_field :file %>

      <%= hidden_field_tag(:subaction, params[:upload_type]) %>

      <%= f.submit "Add Files", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>