[英]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.new
和Conversation.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.