【问题标题】:How to pass arbitrary (non model attribute) values to a rails action?如何将任意(非模型属性)值传递给 rails 动作?
【发布时间】:2023-03-10 15:08:01
【问题描述】:

我有一个用户之间的单向关系模型(用户有很多关系),它包含两个给定用户的 id 以及用户 a 对用户 b 的昵称。我想使用一个表单来允许用户传递另一个用户的电子邮件地址和昵称。如果存在具有该电子邮件的用户,则在用户之间创建关系。如果没有用户匹配,则使用该电子邮件创建一个新的“幻影”用户,然后建立关系。

我对 Rails 比较陌生,首先天真地尝试使用基本的:

= form_for @relationship do |f|
    = f.label :email
    = f.text_field :email
    = f.label :nickname, "Nickname"
    = f.text_field :nickname
    = f.submit "Submit", class: "btn btn-large btn-primary"

这会失败,因为关系模型不包含电子邮件属性。然后我尝试了以下方法,认为它可能会起作用,因为它没有直接引用关系模型。

= form_tag :controller => "relationships", :action => "create" do
    = label :email        
    = text_field :email
    = label :nickname, "Nickname"
    = text_field :nickname
    = submit "Submit", class: "btn btn-large btn-primary"

但这会引发错误“参数数量错误(1 对 2)”

我可以在关系模型中添加一个电子邮件字段,但除了我将使用它来查找所需用户之外,不需要它。我的计划是使用传递给关系控制器中创建操作的电子邮件和昵称值来创建关系或创建新用户,然后根据情况创建关系。那么如何将任意值传递给控制器​​操作?

【问题讨论】:

    标签: ruby-on-rails form-for


    【解决方案1】:

    使用第一种形式,只需在模型中将attr_accessor 设置为电子邮件属性。

    这基本上是一个临时变量,您可以从表单之类的东西中派生它,但它不会保存到数据库中。

    class Relationship < ActiveRecord::Base # <- Assuming that's the name of your Relationship model
    
      attr_accessor :email
    

    【讨论】:

    • 在具有强参数的 Rails 4 中怎么样?
    • @Micah 请参阅stackoverflow.com/a/15920542。只需将它们添加到允许的参数列表中即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多