我有RoR 4.2.0beta。 (虽然这是无关紧要的,因为这是一个初学者的问题)。
我的表单没有在数据库中插入" propuneres"我正在创造它。因此,当我被重定向到它时,它们不会显示在索引页面中。当我通过控制台创建它们时,它们会显示出来。
class PropuneresController < ApplicationController
before_action :prop_params
def new
@user = User.find(params[:user_id])
@propunere = @user.propuneres.build
end
def create
@user= User.find(params[:user_id])
@propunere = @user.propuneres.new(params[:prop_params])
@propunere.save
if @propunere.empty?
render 'new'
else
redirect_to user_propuneres_path
end
end
def index
@user = User.find(params[:user_id])
@propunere = @user.propuneres(params[:prop_params])
end
private
def prop_params
params.require(:propunere).permit(:titlu, :body)
end
end
new.html.erb
<h2> Propunere Nouă </h2>
<%= form_for @propunere do |f| %>
<ul>
<% @propunere.errors.full_messages.each do |error| %>
<li><%= error %></li>
<% end %>
</ul>
<p>
<%= f.label :titlu %><br />
<%= f.text_field :titlu %>
</p>
<p>
<%= f.label :body %><br />
<%= f.text_area :body %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
index.html.erb
<h2> Propuneri: </h2>
<% @propunere.each do |p| %>
<%= p.titlu %>
<%= p.body %>
<% end %>
答案 0 :(得分:2)
不确定是否相关,但您有代码
@propunere.save
if @propunere.empty?
render 'new'
else
redirect_to user_propuneres_path
end
对象@prorunere将永远不会为空,因为你有
@propunere = @user.propuneres.new
,为您的user_id
对象分配了@propunere
永远不会呈现render 'new'
,因此您不会看到任何验证错误,也永远不会发现您的记录未创建的原因
此外,由于您拥有该段代码,并且没有看到错误,这就是最喜欢破坏您的代码
@user.propuneres.new(params[:prop_params])
- 你应该使用你允许的参数,所以它看起来像
@propunere = @user.propuneres.new(prop_params)
答案 1 :(得分:1)
我克隆了你的repo,问题就出现了:new.html.erb
你有
<%= form_for @propunere, url: new_user_propunere_path(@user, @propunere), html: { method: :get } do |f| %>
网址和方法都是错误的。 user_propuneres_path
会为您提供创建操作的正确网址,正确的方法为:post
,而不是:get
。这就是您从未达到create
行动的原因。
您还需要从@propunere = @user.propuneres.new(params[:propunere])
更改为@propunere = @user.propuneres.new(prop_params)
,否则您将获得ActiveModel::ForbiddenAttributesError
例外。
您可以通过在终端中运行rake routes
来查看应用中的所有路线。
答案 2 :(得分:0)
我认为您的索引操作中不需要参数:
@propunere = @user.propuneres
因为你有许多这样的文字,所以将它写成复数更合乎逻辑。
<小时/> 编辑:
正如Avdept建议您的创建操作应如下所示:
def create
@user = User.find(params[:user_id])
@propunere = @user.propuneres.new(prop_params)
respond_to do |format|
if @propunere.save
format.html { redirect_to user_propuneres_path(@user), notice: 'Your propunere has been saved' }
else
format.html { render :new }
end
end
end
答案 3 :(得分:0)
您对Propunere模型有任何验证吗?也许模型无效。您可以使用
用于测试的create!
方法而不是create
,因为如果无法保存对象,它将抛出异常。在持久化之前尝试puts @propunere.inspect
并检查对象的内容是否正常,输出将显示在开发日志中。