我有ideas controller
和static_pages controller
。后者有home
动作,显示所有想法,我也用作根路径。
我希望用户能够编辑显示的想法。到目前为止我有这个:
<% if @ideas.empty? %>
<p>Share your ideas! See what people think about it.</p>
<% else %>
<% @ideas.each do |idea| %>
<div class="panel panel-default">
<div class="panel-heading"><%= idea.name %></div>
<div class="panel-body"><%= idea.description %> <br>
<%= link_to 'Edit', edit_idea_path(idea.id) %>
</div>
</div>
<% end %>
<% end %>
我遇到了一个空想法ID的问题,我通过在idea.id
内添加edit_idea_path
来解决这个问题
现在我的问题是,这是正确的 Rails方式吗?我可以通过其他方式从此索引页面获取构思对象,并在ideas controller
而不是static_pages controller
中使用它吗?
我尝试过使用路由,但是尽管阅读了指南和其他代码,但我对它的理解非常模糊。我很欣赏有关此事的任何见解。
答案 0 :(得分:2)
首先,您需要了解项目的要求定义了您应该在代码中执行的操作,而不是关于正确执行某些操作的方法。您只需遵循rails惯例。
现在,回到你的问题。您只需要在ideas_controller中创建一个操作(将处理视图),该操作将管理de static_pages_controller发出的数据版本,我将调用它(仅作为例如)edit_static_ideas并使用params接收数据:
在您的ideas_controller中:app / controllers / ideas_controller.rb
def edit_static_ideas
@idea = Idea.find(params[:id])
end
然后,您需要在views-&gt; ideas文件夹中创建视图。一个名字,只是为了继续我的例子,我将它命名为edit_static_idea.html.erb。并将您在@idea中获得的数据的负载设置为表单或form_for。然后,您可以提交已编辑的数据并将其上传到其他操作中。
然后你必须配置你的路线文件并添加
配置/ routes.rb中
get 'edit_static_idea/:id', to: 'ideas#edit_static_idea', as: 'edit_ideas'
之后,如果你在你的控制台(在rails项目中)运行“rake routes”,你应该会看到你的新路线(是的!)
现在你必须在路线中选择路径并在static_pages_controller的视图中使用它,将其重定向到ideas_idea的视图处理ideas_controller。并确保您还发送所选项目的ID。
应用程序/视图/ static_pages / home.html.erb:
<%= link_to 'Edit Idea', insert_your_edit_idea_obtainedinrakeroutes_path(id: idea.id) %>
最后,您只需要在edit_static_idea.html.erb中配置表单并为其分配上传/保存路由并将其重定向到您想要的视图。
例如:
在您的路线文件中:config / routes.rb
patch 'save_edited_idea', to: 'ideas#save_edited_idea', as: 'save_edited_idea'
在您的ideas_controller中:app / controllers / ideas_controller.rb
def save_edited_idea
@idea = Idea.find(params[:id])
respond_to do |format|
if @idea.update(idea_params)
format.html { redirect_to the_view_that_you_want_path(id: @idea.id), notice: 'Data saved without problems.' }
else
flash.now[:alert] = "error"
format.html { render :offer }
end
end
end
我不想这么详细,因为我想帮助你理解你必须做的事情。我希望它有所帮助:P