繁体   English   中英

在Ruby on Rails 4中,如何在forms_for助手中设置与模型无关的属性?

[英]In ruby on rails 4, how do I set an attribute in the forms_for helper that is not associated with a model?

我希望能够通过控制器中的params[:to_whom]访问:to_whom文本值。 To_whom在模型中不存在。

我收到一个明智的错误:“对话的未定义方法“ to_whom”

如何添加任意属性以在Rails中传递回控制器?

另外,在我看来,我做了Message.newConversation.new ,这非常丑陋。 我最初在控制器中设置@conversation = Conversation.new ,但是我发现无论如何我都必须在第二个控制器方法中重新创建这些变量,这很有意义(在我点击了提交按钮之后)。 因此,我没有在new方法中设置@message@conversation ,而是从new删除了所有行,并在视图中执行了.new语法。 有没有更优雅的方式来编写此代码,因此它不会显得那么老套?

控制器:

 class ConversationsController < ApplicationController
   attr_accessor :conversation, :user, :to_whom

   # this is the method that generates the below view
   def new
   end

   def create
      ...
   end
 end

视图:

<%= form_for([current_user, Conversation.new]) do |c| %>
  <%= c.label :to_whom %>
  <%= c.text_field :to_whom %>

  <%= c.label :subject %>
  <%= c.text_field :subject %>   
  <%= form_for(Message.new) do |m| %>
  <%= m.label :message %>
  <%= m.text_field :text %>

    <div class="actions">
      <%= submit_tag "send" %>
    </div>
  <% end %>
<% end %>

m.text_field :to_whom只是构建HTML输入标签的助手。 您可以使用原始html编写自己的代码,用erb标签填充空白,也可以使用其他帮助程序,例如text_field_tag

text_field_tag "to_whom", params[:to_whom]

虚拟属性

您的attr_accessor属于您的模型(而不是您的控制器)。 当前,您已将其存储在controller ,这在模型级别上将不起作用:

#app/models/conversation.rb
Class Conversation < ActiveRecord::Base
    attr_accessor :conversation, :user, :to_whom
end

#app/controllers/conversations_controller.rb
    # remove attr_accessor 

您必须记住,由于Ruby是面向对象的,因此您获得的所有data对象都来自model 这意味着,如果您调用@conversation = Conversation.new ,则该模型的attributes实际上是在conversation模型中创建的

通常,模型将根据您的数据库列设置属性。 如果您没有数据库列,则需要使用attr_accessor模块创建相关的getter / setter方法。

我认为您需要使用fields_for助手,它应该像下面这样,

= c.fields_for :message do

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM