0

既存のビュー (モデルの「表示」ビュー) に連絡先フォームを実装しようとしています。

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
4

1 に答える 1

2
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

それを使用してフォームを作成するとき<%= form_for @message do |f| %>は、newmessage というアクションで行ったように、フォームがレンダリングされるアクションでその変数を初期化する必要があることを意味しますが、そのアクションを使用する場合は、フォームに URL を追加する必要があります。カスタムアクション用の Rails 3 Form のように

  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
于 2013-05-28T20:48:16.703 に答える