rails - undefined方法`model_name'

时间:2016-04-16 07:30:43

标签: ruby-on-rails

我有一个基本的博客网站,我想让用户提供更正'发帖(只是把它当作评论)。修正对象属于一个帖子,而该帖子又属于一个用户(我使用的是Devise)。

我希望该表单能够创建一个新的更正嵌套在帖子的页面中,所以我只是使用<% render :template => "corrections/new" %>在posts / show.html.erb中呈现表单。我得到了一个未定义的方法model_name&#39;但是,来自更正/ new.html.erb中的行form_for行的错误。

以下表格:

<% form_for [@correction, :url=> user_post_corrections_path(current_user, @post, @correction)], html: { multipart: true} do |f| %>
  <div class="field">
    <%= f.label :correction %>
    <%= f.text_field :correction %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

这里是corrections_controller:

class CorrectionsController < ApplicationController

  def new
    @post = Post.find(params[:post_id])
    @correction = current_user.@post.corrections.build
    respond_with(@correction)
  end

  def create
    @post = Post.find(params[:post_id])
    @correction = current_user.@post.corrections.build
    if @correction.save
      redirect_to user_post_path(current_user, @correction.post_id)
    end
  end
end

在我的routes.rb中:

  resources :users do
    resources :posts do
      resources :corrections
      end
    end

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

我可以看到几个问题,首先是关闭:

表单未呈现: 应该评估表格不计算,因此您应该使用&lt;%=%&gt;标记而不是&lt; %%&gt;标签,所以它变成:

<%= form_for @correction, url: user_post_corrections_path(current_user, @post, @correction), html: { multipart: true} do |f| %>      
   

第二:你说的是form_for @correction,你说这个表单显示在posts / show中,这意味着post的show动作应该在其控制器中有以下内容:

@correction = Correction.new user: current_user, post: @post

这假设您使用@post变量进行后期展示意味着您有类似

的内容
@post = Post.find params[:id]

此行完全关闭

@correction = current_user.@post.corrections.build
你可以说:

@correction = Correction.new correction_params
@correction.user = current_user
@correction.post = @post
if @correction.save
  redirect_to user_post_path(current_user, @correction.post_id)
end

重要的部分是你在post控制器上的show动作,它具有@correction对象的初始化。

答案 1 :(得分:1)

此行显示:

@correction = current_user.@post.corrections.build

@post是一个实例变量,而不是current_user

上的方法

您是否打算与当前用户建立正确的用户?以下应该有效:

@post.corrections.build(user: current_user)

如果您的更正模型has_many :users, through: :posts,那么以下内容应该有效:

@post.corrections.build(users: [current_user])

修改

form_for的格式也不正确。 url:中的form_for密钥不属于资源数组(form_for中的第一个arg)

以下修改应解决错误,前提是user_post_corrections_path需要:id:post_id:correction_id

form_for @correction, url: user_post_corrections_path(current_user, @post, @correction), html: { multipart: true} do |f|

如果可能,我还会将您的路由减少到两个嵌套级别。

也许这更容易?

resources :posts do
  resources :corrections
  end
end

如果它暗示帖子属于current_user,则可能没有必要在路径路径中包含/users