【问题标题】:rails contact form issuerails联系表格问题
【发布时间】:2013-05-28 20:22:25
【问题描述】:

我正在尝试在现有视图(模型的“显示”视图)上实现联系我们表单。

我为 NilClass:Class 得到了一个未定义的方法 `model_name',但我不确定我是否正确地实现了一些东西。

在我的 show.html.erb 中

<%= form_for @message do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.label :email %><br />
    <%= f.text_field :email %>
  </p>
  <p>
    <%= f.label :content, "Message" %><br />
    <%= f.text_area :content %>
  </p>
  <p><%= f.submit "Send Message" %></p>
<% end %>

在具有站点所有操作(索引、更新、显示)的主控制器中,我添加了以下操作

  # GET /listings/1
  # GET /listings/1.json
  def show
    @listing = Listing.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @listing }
    end
  end


  def newmessage
    @message = Message.new
  end


  def sendmessage
    @message = Message.new(params[:message])
    if @message.valid?
     #  MessageMailer.new_message(@message).deliver
      flash[:notice] = "Message envoy avec succes"
      redirect_to root_path
    else
      render :newmessage
    end
  end

我的 Message.rb 类看起来像这样:

class Message
  extend ActiveModel::Naming
  include ActiveModel::Conversion
  include ActiveModel::Validations
  include ActionView::Helpers::TextHelper

  attr_accessor :name, :email, :message

  validates :name, 
            :presence => true

  validates :email,
            :format => { :with => /\b[A-Z0-9._%a-z\-]+@(?:[A-Z0-9a-z\-]+\.)+[A-Za-z]{2,4}\z/ }

  validates :message,
            :length => { :minimum => 10, :maximum => 1000 }


  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end


   def persisted?
     false
    end

end

【问题讨论】:

  • 表单呈现的控制器和动作名称是什么?您可以在呈现@message = Message.new 表单的操作中加载消息变量,可能您在消息控制器的显示操作中执行此操作。

标签: ruby-on-rails ruby-on-rails-3.1


【解决方案1】:
def your_action_where_you_render_form
  @message = Message.new
end

def create
  @message = Message.new(params[:message])
  if @message.save
    do this
  else
    do that
  end
end

当您使用&lt;%= form_for @message do |f| %&gt; 构建表单时,这意味着您需要在呈现表单的操作中初始化该变量,就像您在名为 newmessage 的操作中所做的那样,但是如果您想使用该操作,则必须在表单中添加 url 就像这里 Rails 3 Form For Custom Action

  def show
    @listing = Listing.find(params[:id])
    @message = Message.new

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @listing }
    end
  end

【讨论】:

  • 我确实在我的操作中初始化了变量。实际上,除了我的操作称为 newmessage 和 sendmessage 之外,我的代码与您的代码相似。我还添加了 :url => {:action => "sendmessage"} 但我收到错误 undefined method `model_name' for NilClass:Class
  • 似乎 url 需要是 :url => sendmessage_path, sendmessage_path do |f| %> ,当您在控制台中运行 rake 路由时,url 取决于您的 sendmessage 操作的路由是什么样的
  • 另外,您是说您在正确的操作中初始化了变量,但我对此表示怀疑,因为您在 show.html.erb 中呈现表单,这可能意味着您正在调用 show 操作那一刻,这意味着您应该在表演动作中使用@message = Message.new,您还没有在此处发布表演动作,所以我不能确定您是否在需要的地方拥有它,您知道得更好。
  • 感谢您的澄清。我在问题中添加了显示动作。 show 操作用于显示特定列表,但它还包含消息的表单
  • 在我的回答中查看显示操作,如果此操作呈现您的显示页面,则意味着您必须在此处初始化消息,现在您甚至可以尝试不带 url 的表单,只需
猜你喜欢
  • 1970-01-01
  • 2013-08-15
  • 2016-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 2013-11-02
  • 2013-09-19
相关资源
最近更新 更多